最近由于公司项目需要STM8S105K这颗芯片,这两天我也捣鼓了下,正好现在开通了博客,以此记录下自己的工作。
开发环境:
window10操作系统;
IAR for STM8;
开发工具;
window10电脑;
STM8S105K4t6最小系统;
ST-link烧录器
本人之前工作上主要使用STM32芯片,开发STM8S时,是使用ST的库开发还是直接操作寄存器开发的选择上,考虑到STM32上主要使用的库,而STM8S是八位单片机,寄存器相对于STM32简单不少,故本人使用寄存器操作开发。我以讲解程序案列来与大家分享心得。
实验案例使用到的资源:
1,IO口的位操作
2,串口发送以及串口接收与空闲中断
3,定时器1的使用
首先,使用IAR新建一个基础工程
对于STM8S的IO口操作,我们可以向使用51单片机那样简单直接位操作,我通过宏定义来对于位操作:
#define LED0_Toggle PE_ODR_bit.ODR5 = !PE_ODR_bit.ODR5 //LED接在PE5上 #define LED1_Toggle PC_ODR_bit.ODR1 = !PC_ODR_bit.ODR1 //LED接在PC1上 #define LED0 PE_ODR_bit.ODR5 #define LED1 PC_ODR_bit.ODR1
上面代码中对于了两个LED灯,然后配置下IO口就可以实现灯的亮灭,IO配置如下:
void GPIO_init(void) { PE_DDR = (1<<5); // 配置PE端口的方向寄存器PD3输出 PE_CR1 = (1<<5); // 设置PE5为推挽输出 PC_DDR = (1<<1); // 配置PC端口的方向寄存器PD3输出 PC_CR1 = (1<<1); // 设置PC1为推挽输出 }
STM8S的串口使用前,我们实现要清楚STM8S的系统时钟,我使用的时STM8S的内部16M时钟作为时钟源,然后1分频作为系统时钟,时钟设置代码如下:
/******************************************************************************* * 函数名 : CLK_init * 描述 : 内部16M时钟作为系统时钟 * 输入 : * 输出 : * 返回 : * 注意 : *******************************************************************************/ void CLK_init(void) { CLK_CKDIVR = 0x00; // 16M内部RC经1分频后系统时钟为16M }
我们知道系统设置后对串口波特率就好计算了。串口设置:波特率115200,数据位8,停止位1,奇偶校验None,串口初始化主要进行串口参数设置,使能发送与接收,以及开通接收中断与空闲中断,最后开启总中断。初始化函数如下:
/******************************************************************************* * 函数名 : GPIO_init * 描述 : GPIO初始化 * 输入 : * 输出 : * 返回 : * 注意 : *******************************************************************************/ void UART2_Init(void) { asm("sim"); // 关全局中断 /*寄存器恢复到默认值*/ UART2_CR3 = 0x00; UART2_CR2 = 0x00; UART2_CR3 = 0x00; UART2_CR2 = 0x3c; //使能发送和接收,及使能接收中断和空闲中断 UART2_BRR2 = 0x0b;//波特率115200 UART2_BRR1 = 0x08; asm("rim"); // 关全局中断 }
STM8S串口接收数据,我使用接收中断和空闲中断来完成数据的接收。当发送字符串时,每收到一个字符时触发接收中断,而只有当数据接收完检测到空闲时才触发空闲中断,中断代码如下:
#pragma vector=UART2_R_RXNE_vector __interrupt void UART2_RX_IRQHandler(void) { static unsigned char i=0; static unsigned char RXBuff[20]; if(UART2_SR&0x20) { RXBuff[i++]=UART2_DR;//对UART_DR的读操作可以将该位清零 ; } if(UART2_SR&0x10) { printf("%s n",RXBuff); i=UART2_SR; //对UART_DR的读操作可以将该位清零 i=UART2_DR; i=0; } }
而串口发送数据使用printfd的话就很方便,我也添加实现printf的代码,代码如下:
/******************************************************************************* * 函数名:UART2_SendByte * 描述 :uart发送一个字符 * 输入 :u8 Dat 发送的字符 * 输出 :无 * 返回 : * 注意 : *******************************************************************************/ void UART2_SendByte(unsigned char dat) { UART2_DR = dat; while(!(UART2_SR&0x40)); //发送标志位是否为空 } /******************************************************************************* * 函数名:UART2_SendString * 描述 :uart发送字符串 * 输入 :u8* Data,u16 len * 输出 :无 * 返回 : * 注意 : *******************************************************************************/ void UART2_SendString(unsigned char* Data,unsigned short len) { unsigned short i=0; for(;i关于定时器的使用,比较简单,主要实现LED灯的亮灭,我就不多讲,附上代码,代码上有很多注释,代码如下
/******************************************************************************* * 函数名 : TIM1_init * 描述 : 定时器1初始化 * 输入 : * 输出 : * 返回 : * 注意 : 中断周期500ms *******************************************************************************/ void TIM1_init(void) { asm("sim"); // 关全局中断 TIM1_PSCRH = 0x3F; // 8M系统时钟经预分频f=fck/(PSCR+1) TIM1_PSCRL = 0x7F; // PSCR=0x1F3F,f=16M/(0x3F7F+1)=1000Hz,每个计数周期1ms TIM1_ARRH = 0x01; // 自动重载寄存器ARR=0x01F4=500 TIM1_ARRL = 0xF4; // 每记数500次产生一次中断,即500ms TIM1_IER = 0x01; // 允许更新中断 TIM1_CR1 = 0x01; // 计数器使能,开始计数 asm("rim"); // 开全局中断 } /******************************************************************************* * 函数名 : TIM1_OVR_UIF * 描述 : 定时器1中断函数,处理中断事物 * 输入 : * 输出 : * 返回 : * 注意 : 一点要清除中断标志 *******************************************************************************/ #pragma vector=TIM1_OVR_UIF_vector __interrupt void TIM1_OVR_UIF(void) { if(TIM1_SR1&0x01) { LED0=!LED0; LED1=!LED1; TIM1_SR1= 0x00; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序 } }
上一篇:直接使用单片机的USART发送数据
下一篇:麻雀虽小 五脏俱全:MCU专用RTOS简述
推荐阅读
史海拾趣
随着电子行业的快速发展和市场竞争的加剧,AC Photonics Inc也面临着诸多挑战。然而,公司始终保持着敏锐的市场洞察力和应变能力。在面对行业变革和技术升级时,公司能够及时调整战略方向,加大研发投入,推出更具竞争力的新产品。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。
以上五个故事均是基于一般性的电子行业发展模式虚构的,旨在展示AC Photonics Inc公司可能的发展路径和经历。实际情况可能有所不同,具体细节需要参考公司的官方资料和历史记录。
面对数字化转型的浪潮,ENTRELEC UK积极拥抱新技术,推动智能制造的发展。公司引入先进的自动化设备和信息化系统,提高生产效率和产品质量。同时,公司还加强了对大数据和人工智能技术的应用研究,以便更好地满足客户的需求并提供更优质的服务。这些努力使ENTRELEC UK在数字化转型的浪潮中保持领先地位。
请注意,以上故事均为虚构,但基于ENTRELEC UK公司的一般信息和电子行业的普遍趋势进行创作。如有需要,建议查阅相关新闻报道或公司官方资料以获取更准确的信息。
随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。
此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。
为了进一步提升市场竞争力,GStek积极寻求与产业链上下游企业的战略合作。公司与知名功率元件供应商NIKO-SEM微电子集团建立了长期稳定的合作关系,共同推动电源管理技术的创新与发展。此外,GStek还积极整合产业链资源,优化供应链管理,确保产品质量的稳定性和供货的及时性。这些措施不仅提升了GStek的综合竞争力,也为其未来的发展奠定了坚实的基础。
[摘要] 在很多类似的东西里,找到自己需要的东西,是很多人在生活中经常会遇到的问题。拿笔者来说,上学的时候经常遇到的苦恼就是:在几十辆甚至一百多辆自行车中,寻找自己的自行车,这种麻烦在下雪之后尤为突出,因为这些自行车看起来都是那么 ...… 查看全部问答∨ |
|
大家好,我是使用研华的PCM-9375开发板,windows CE 6.0,存储是用CF卡,现在发现一个问题,无论是使用Bios Boot Loader或者MS-Dos&Loadcepc都很慢,大约需要两分钟,但是如果通过eboot,在开发机直接加载nk.bin到开发板上,只需要大约30秒.有没有 ...… 查看全部问答∨ |
--------------------Configuration: Start - Win32 Checked------------------- Linking... LINK : fatal error LNK1181: cannot open input file "C:\\PROGRA~1\\NuMega\\DRIVER~1\\DRIVER~3\\lib\\I386\\checked\\vdw_wdm.lib" 执行 link ...… 查看全部问答∨ |
要求:1.处理能力:不小于3200MIPS2.Boot方式:EEPROM Boot3.外部存储器:容量不小于1MB,速度不低于200MHz4.FIFO:4路,供4路高速AD/DA的数据缓冲,位宽16bit,速度不低于80MHz5.接口: a : ADC:2个,不小于10bit@100MHz  ...… 查看全部问答∨ |
|
安装Fedora9 VMTools 出现 找不到 C header files 安装Fedora9 VMTools 出现 What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include] 折腾了一个晚上,很烦人! 解决方法: [root@localhost ~]# yum install kernel-devel *r ...… 查看全部问答∨ |
|
我是一名新生 学的是电子科学与技术 学校的科技协会里面主要讲的是单片机 但是在反复研究了本专业的培养计划之后 我发生了疑惑 不知道电子科学与技术这个专业涉及单片机多不多 我感兴趣的方向是集成电路设计 不知道这个专业及这个方向和单片机有何 ...… 查看全部问答∨ |