历史上的今天
返回首页

历史上的今天

今天是:2025年02月23日(星期日)

正在发生

2021年02月23日 | IAR下STM8S207单片机各模块的无库例程

2021-02-23 来源:eefocus

简介:TIM/ADC/CLOCK/EEPROM/SPI/UART/WWDG/IWDG等不使用库的应用例程,包含SPI双机通讯、定时器的捕获、PWM各功能的实现等;原理图有2个错误:1,晶振电容为22P;2,按键电容位置错;



以下模块全部已调试通过:


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"

/* Author: EighthArmy @ July.2010 */

/*****************************************************

@Fn: ConfigADC10()

@Br: 配置ADC10

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigADC10( void ){

ADC_CSR = ( 1 << EOCIE )

+ ( 1 << CH02 ) + ( 1 << CH01 ) + ( 1 << CH00 );

/* 中断使能, 选中CH7 */

ADC_CR2 = ( 1 << ALIGN ); /* 右对齐 */

ADC_CR1 = ( 1 << SPSEL02 ) + ( 1 << SPSEL01 ) + ( 1 << SPSEL00 )

+ ( 1 << CONT ) + ( 1 << ADON );

/* Fadc = Fmaster / 18, 持续转换, ADON写1唤醒ADC */

ADC_CR1 |= ( 1 << ADON ); /* 当ADON为1时再写1则启动转换 */

}

suzhwt 发表于 2010-9-21 15:43


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/*****************************************************

@Fn: ConfigClock()

@Br: 配置处理器的时钟

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigClock( void ){

CLK_ICKR = ( 1 << HSIEN ); /* 使能内部高速RC OSC */

CLK_ECKR = ( 1 << HSEEN ); /* 打开外部晶体振荡器 */

while(( CLK_ECKR & 0x02 ) == 0 ); /* ( 1 << HSERDY ) */


CLK_SWR = F_MASTER_HSE; /* 指定切换的HSE主时钟 */


while(( CLK_SWCR & 0x08 ) == 0 ); /* ( 1 << SWIF ) */

CLK_SWCR |= ( 1 << SWEN ); /* 执行切换 */


CLK_CKDIVR = 0x00; /* Fcpu = Fmaster = 18MHz */


CLK_PCKENR1 = ( 1 << TM1_CLK_ENABLE )

+ ( 1 << TM3_CLK_ENABLE )

+ ( 1 << TM2_CLK_ENABLE )

+ ( 1 << TM4_CLK_ENABLE )

+ ( 1 << UART1_CLK_ENABLE )

+ ( 1 << SPI_CLK_ENABLE );


CLK_PCKENR2 = ( 1 << ADC_CLK_ENABLE );

}

suzhwt 发表于 2010-9-21 15:43


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


#define FIRST_SECURITY_KEY 0xAE

#define SECOND_SECURITY_KEY 0x56

#define ADD_EEPROM_S8 0x4000

/* STM8S207S8的CODE空间为64K,而EEPROM的大小为1536字节,即:3页 * 512节/页 */

/* EEPROM的KEY写入与FLASH的KEY正好相反 */



/*****************************************************

@Fn: InitialFlashReg()

@Br: 初始化闪存寄存器组

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void InitialFlashReg( void ){

FLASH_CR1 = FLASH_CR1_RESET_VALUE;

FLASH_CR2 = FLASH_CR2_RESET_VALUE;

FLASH_NCR2 = FLASH_NCR2_RESET_VALUE;

FLASH_IAPSR &= ( uchar )(~( 1 << DUL )); /* 清除只读DATA区解锁 */

FLASH_IAPSR &= ( uchar )(~( 1 << PUL )); /* 清除程序区解锁 */

}

/*****************************************************

@Fn: UnlockFlash()

@Br: 解锁存储器

@Pa: 存储器类型: 不是程序区就是只读数据区

@Rt: 无

@Sp: 2个密钥的操作序列正好相反

*****************************************************/

void UnlockFlash( uchar Type ){

if( Type == UNLOCK_FLASH_TYPE ) /* 解锁程序区 */

{

FLASH_DUKR = SECOND_SECURITY_KEY;

FLASH_DUKR = FIRST_SECURITY_KEY;

}

else /* 解锁只读数据区 */

{

FLASH_DUKR = FIRST_SECURITY_KEY;

FLASH_DUKR = SECOND_SECURITY_KEY;

}

}

/*****************************************************

@Fn: LockFlash()

@Br: 锁定存储器

@Pa: 存储器类型:不是程序区就是只读数据区

@Rt: 无

@Sp: 无

*****************************************************/

void LockFlash( uchar Type ){

if( Type == UNLOCK_FLASH_TYPE )

{

FLASH_IAPSR &= ~( 1 << PUL );

}

else

{

FLASH_IAPSR &= ~( 1 << DUL );

}

}

/*****************************************************

@Fn: InitialFlashReg()

@Br: 写入一字节到指定只读数据区[EEPROM]

@Pa: 指定EEPROM地址与数据内容

@Rt: 无

@Sp: 无

*****************************************************/

void WriteByteToFLASH( ulong Address, uchar Data ){

*(( __far uchar * ) Address ) = Data;

}

/*****************************************************

@Fn: Write4BytToFlash()

@Br: 写入4字节到指定EEPROM的连续4字节空间

@Pa: EEPROM地址与LONG型数据内容

@Rt: 无

@Sp: 数据写入方式为小端模式

*****************************************************/

void Write4BytToFlash( ulong Address, ulong Data ){

/* Enable Word Write Once */

FLASH_CR2 |= ( 1 << WPRG );

FLASH_NCR2 &= ( uchar )( ~( 1 << NWPRG ));


*((( __far uchar * )Address ) + 3 ) = *(( uchar * )( &Data )); /* Write one byte - from Highest address*/

*((( __far uchar * )Address ) + 2 ) = *(( uchar * )( &Data ) + 1 ); /* Write one byte*/

*((( __far uchar * )Address ) + 1 ) = *(( uchar * )( &Data ) + 2 ); /* Write one byte*/

*(( __far uchar * )Address ) = *(( uchar * )( &Data ) + 3 ); /* Write one byte - from higher address*/

}

/*****************************************************

@Fn: ReadByteEEPROM()

@Br: 从EEPROM中读取1字节

@Pa: 指定EEPROM地址

@Rt: 读取的CHAR型内容

@Sp: 无

*****************************************************/

uchar ReadByteEEPROM( ulong Address ){

return(*(( __far uchar* ) Address )); /* Read byte */

}

/*****************************************************

@Fn: Read4BytFromFlash()

@Br: 从EEPROM中读取连续的4字节

@Pa: 指定EEPROM地址

@Rt: 读取的LONG内容

@Sp: 小端模式

*****************************************************/

ulong Read4BytFromFlash( ulong Address ){

ulong i;

ulong Temp[2];


Temp[0] = *(( __far uchar * )Address );

Temp[0] |= ( *((( __far uchar * )Address ) + 1 ) << 8 );

Temp[1] = *((( __far uchar * )Address ) + 2 );

Temp[1] |= ( *((( __far uchar * )Address ) + 3 ) << 8 );


i = Temp[0] + ( Temp[1] << 16 );

free( Temp );

return i;

}

/*****************************************************

@Fn: EraseByteFLASH()

@Br: 擦除EEPROM中内容

@Pa: 指定EEPROM地址

@Rt: 无

@Sp: 无

*****************************************************/

void EraseByteFLASH( uint Address ){

*(( __near uchar * ) Address ) = 0x00;

}







void Test( void ){

ulong i;

UnlockFlash( UNLOCK_EEPROM_TYPE );

Write4BytToFlash( ADD_EEPROM_S8, 0x12345678 );

LockFlash( UNLOCK_EEPROM_TYPE );

i = Read4BytFromFlash( ADD_EEPROM_S8 );

i = i;

}

suzhwt 发表于 2010-9-21 15:43


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/*****************************************************

@Fn: ConfigPortE()

@Br: 配置端口E

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigPortE( void ){

PE_DDR = ( 1 << PE6 ) + ( 1 << PE5 );

PE_CR1 = 0;

PE_CR2 = 0;

}

/*****************************************************

@Fn: ConfigGPIO()

@Br: 配置端口

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigGPIO( void ){

PG_DDR = 0x03; /* 输出 */

PG_CR1 = 0x03; /* 推挽模式 */

PG_CR2 = 0x00; /* 速度2MHz */


ConfigPortE();

}

suzhwt 发表于 2010-9-21 15:44


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/*****************************************************

@Fn: ConfigIWDG()

@Br: IWDG初始化

@Pa: 无

@Rt: 无

@Sp: 需要选择字支持

*****************************************************/

void ConfigIWDG( void ){

IWDG_KR = IWDG_KEY_ACCESS; /* 写入修改值使能键值 */


IWDG_PR = ( 1 << IWDG_PR02 ) + ( 1 << IWDG_PR01 ); /* 1.02s时长 */

IWDG_RLR = 0xFF;

IWDG_KR = IWDG_KEY_REFRESH; /* 写入后恢复到保护状态 */


IWDG_KR = IWDG_KEY_EBABLE; /* 启动看门狗 */

}

/*****************************************************

@Fn: ClearIWDG()

@Br: 清看门狗IWDG

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ClearIWDG( void ){


IWDG_KR = IWDG_KEY_REFRESH; /* 清看门狗 */

}

suzhwt 发表于 2010-9-21 15:44


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/*****************************************************

@Fn: ConfigInterrupt()

@Br: 配置中断输入口

@Pa: 无

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigInterrupt( void ){

PA_DDR &= ~( 1 << PA6 ); /* 配置为输入口 */

PA_CR1 = ( 1 << C16 ); /* 配置上拉电阻 */

PA_CR2 = ( 1 << C26 ); /* 使能中断 */


CPU_CCR |= ( 1 << I1 ) + ( 1 << I0 ); /* 改为最高优先级 */

EXTI_CR1 = 0; /* 下降沿和低电平触发 */

}

suzhwt 发表于 2010-9-21 15:44


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/*****************************************************

@Fn: ConfigSPI()

@Br: 配置SPI接口

@Pa: 工作模式

@Rt: 无

@Sp: 无

*****************************************************/

void ConfigSPI( uchar WorkMode ){

SPI_CR1 = 0x00;

SPI_CR2 = ( uchar )( 1 << SSM ); /* SSI位的值代替NSS脚控制从设备的选择 */

SPI_ICR = 0x00;

SPI_SR = ( uchar )( 1 << SPI_TXE );


SPI_CR1 = ( uchar )(( uchar )( 1 << LSBFIRST )

+ ( uchar )( 1 << BR02 ) /* 波特率 = 2 ^ ( BR[2:0] + 1 ) = Fmaster/32 */

+ ( uchar )( 1 << SPI_CPOL )

+ ( uchar )( 1 << SPI_CPHA ));

if( WorkMode == SPI_MASTER_MODE )

{

SPI_CR2 |= ( uchar )( 1 << SSI );

SPI_CR1 |= ( uchar )( 1 << MSTR );

}

else

{


SPI_CR2 &= ~( uchar )( 1 << SSI );

SPI_CR1 &= ~( uchar )( 1 << MSTR );

}


SPI_ICR |= ( uchar )( 1 << RXIE ); /* 使能SPI接收中断 */

}

/*****************************************************

@Fn: EnablesSPI()

@Br: SPI状态

@Pa: 不是打开就是关闭

@Rt: 无

@Sp: 无

*****************************************************/

void EnablesSPI( uchar Type ){

if( Type == SPI_ENABLES )

{

SPI_CR1 |= ( uchar )( 1 << SPE );

}

else

{

SPI_CR1 &= ~( uchar )( 1 << SPE );

}

}

/*****************************************************

@Fn: TransmitBySPI()

@Br: 从SPI传输数据

@Pa: 数据组冲以及发送帧的长度

@Rt: 无

@Sp: 无

*****************************************************/

void TransmitBySPI( uchar *Buff, uchar Len ){

for( uchar i = 0; i < Len; i++ )

{

SPI_DR = *Buff++;

while( SPI_SR & ( 1 << TXE ) == 0 );

}

}

suzhwt 发表于 2010-9-21 15:44


#include "ioSTM8S207S8.h"

#include "Includes.h"

#include "Constants.h"

#include "Functions.h"

#include "Globals.h"


/* Author: EighthArmy @ July.2010 */


/* Excel2000 expression as: v = sin( DEGREE * PI()/180 ) */

/* 0 degree = 0x024A / 2 = 0x0125 = 293 */

/* 10 degree = 0x0125 + sin10 = 344 */

#define SIN_WAVE_LEN 36

const uint SIN_TABLE[SIN_WAVE_LEN] = {

9376, 9312, 9088, 8752, 8272, 7696,

推荐阅读

史海拾趣

DeLorme公司的发展小趣事

近年来,随着智能手机和移动互联网技术的快速发展,传统的GPS导航设备市场受到了巨大冲击。面对这一行业变革,DeLorme公司及时调整战略方向,将重心转向智能导航应用软件的开发和推广。他们通过与智能手机厂商的合作,将自己的导航软件集成到手机系统中,为用户提供更加便捷、高效的导航服务。同时,他们还积极探索新的商业模式和市场机会,为公司的未来发展奠定了坚实基础。

API Technologies公司的发展小趣事

API Technologies一直注重技术创新和研发投入。公司不断引进先进的生产设备和技术人才,加大对新产品、新技术的研发力度。通过不断的技术创新,API Technologies成功推出了一系列具有自主知识产权的高性能产品,不仅提升了公司的核心竞争力,也为公司的持续发展注入了新的动力。

FREESCALE (NXP)公司的发展小趣事

作为一家有社会责任感的企业,API Technologies不仅关注经济效益,也积极履行社会责任。公司注重环保和可持续发展,在生产过程中采取了一系列环保措施,降低能耗和排放。同时,公司还积极参与社会公益活动,回馈社会,为社区的繁荣和发展做出了贡献。

这些故事展示了API Technologies在电子行业中的发展历程和取得的成就。通过不断创新、全球化布局、品质管理和履行社会责任,公司逐渐成为了电子行业的佼佼者。

DMS Electronic Components, Inc公司的发展小趣事

DMS非常重视人才的培养和引进。公司建立了完善的人才选拔和激励机制,吸引了一批高素质的专业人才加入。这些人才在技术研发、市场营销、生产管理等方面发挥了重要作用,为公司的快速发展提供了有力保障。同时,DMS还注重员工的培训和发展,为员工提供了广阔的职业发展空间。

Amveco Toroidal Power Products公司的发展小趣事

为了进一步扩大市场份额,Amveco公司积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名的电子设备制造商建立了长期稳定的合作关系,为其提供定制化的环形变压器解决方案。此外,公司还通过参加国际电子展会、建立海外销售网络等方式,积极开拓国际市场,实现了业务的全球化布局。

Electronic公司的发展小趣事

特斯拉,虽然是一家电动汽车公司,但其在电子行业的发展中也展现出了强大的跨界创新能力。特斯拉通过自主研发和生产电池、电机等核心零部件,成功将电动汽车的性能和品质提升到了新的高度。同时,特斯拉还积极探索自动驾驶、智能交通等前沿技术,不断推动电动汽车行业的变革和发展。特斯拉的跨界创新不仅颠覆了传统汽车行业的格局,也为电子行业带来了新的机遇和挑战。

请注意,以上故事框架仅供参考,具体细节和数据可能需要根据实际情况进行调整和补充。同时,由于篇幅限制,每个故事的字数可能无法满足500字以上的要求。

问答坊 | AI 解惑

FPGA器件 内部RAM 或RAM 使用之讨论

altera 器件或 Xilinx 器件 内部都有RAM 或ROM ,怎样使用这些RAM 或ROM ? altera 器件 可以直接用Quartus 提供的宏函数生成指定的大小,端口的ROM 和RAM 供设计使用,也可以直接用元件调用的方式使用RAM或ROM。 Xilinx 器件   可以直 ...…

查看全部问答>

PIC16F631编译器的选择?

请教PIC16F631编译器应该选择哪一个版本,如果有具体的下载地址那就更好了,谢谢各位了,急~~~~…

查看全部问答>

请问在wlan中如何取得各个AP的验证方式和加密方式?

  如题,在无线网卡扫描各个AP的时候,如何获取AP的验证模式和加密模式? 这些模式要在用OID_802_11_ENCRYPTION_STATUS, OID_802_11_AUTHENTICATION_MODE, 设置本地无线网卡的时候用到,…

查看全部问答>

PPC 2003模拟器问题

我先安装了Microsoft  Pocket  PC  2003  SDK.msi 又装了Chinese  (Simplified)  Emulation  Images.msi   可还是不能用啊 错误: Emulator for windows ce ...…

查看全部问答>

verilog generate模块中的参数定义问题?

parameter DQS_IO_COL=0;parameter DQ_IO_MS=0;.......genvar dq_i;  generate    for(dq_i = 0; dq_i < DQ_WIDTH; dq_i = dq_i+1) begin: gen_dq      ddr2_phy_dq_iob #      &nb ...…

查看全部问答>

LM3S8962UART控制MODEM通信之二MODEM通信模式及转换

MODEM三种模式及转换     Modem最初只是用于数据传输。然而,随着用户需求的不断增长以及厂商之间的激烈竞争,目前市场上越来越多的出现了一些“二合一”、“三合一”的Modem。这些Modem除了可以进行数据传输以外,还具有传真 ...…

查看全部问答>

已经调试通过的stm32I2C中断方式程序

已经调试通过的stm32 I2C 中断方式程序, 感兴趣的可以研究参考一下,顺便帮挑挑毛病. IAR_STM32_I2C.rar (304.14 KB) 下载次数: 211 2010-7-15 17:22 写0 - 128到AT24C01B全部空间,再读出来,比较通过, 亮PB14,PB15管 ...…

查看全部问答>

奇怪!EXTI为什么设不了????

                                 我用GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);设置PE0为外部中断源,但怎么也设置不对,察看寄存 ...…

查看全部问答>

用DSP做图像处理和分析,研究生在读,无人指导

项目需要,要做一个以DSP为核心的、对工业相机采集到的图像信号做实时高速处理和分析的小型“下位机”,将来想和工业相机绑在一起成为一个“智能相机”。知道这个已经是成熟技术,但我们要做的是专用功能的,不能外购常规产品。手上有一套不错的TMS ...…

查看全部问答>

秀一秀,这学期校电赛做的POV

用的是LQFP的89C52RC,无刷电机。。   [ 本帖最后由 glacier1 于 2012-7-12 15:34 编辑 ]…

查看全部问答>