IARFORSTM8例程_第1页
IARFORSTM8例程_第2页
IARFORSTM8例程_第3页
IARFORSTM8例程_第4页
IARFORSTM8例程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IAR+STM8EXTI外部中断控制寄存器2013-03-21 23:23:15|分类:STM8|举报|字号订阅这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。吸取前面UART3的教训,先看开发板的原理图吧。这个按键被接到了STM8S207SB的PD7上,已做了上拉处理。为了简单明了,还是点LED1吧。按一下LED1亮,再按一下LED1灭。好了,写程序吧。i nclude #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 / 开发板上的LED1接在PD3上void GPIO_init(void)PD_DDR = 0x08; / 配

2、置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出PD_CR2 = 0x80; / 使能PD7外部中断void EXTI_init(void)EXTI_CR1 = 0x80; / PD口下降沿触发中断#pragma vector=0x02 / 这里很关键!看下面说明。_interrupt void EXTI_PD7_TLI(void)LED1_FLASH;void init_devices(void)asm(sim); / 关全局中断GPIO_init();EXTI_init();asm(rim); / 开全局中断void main( void )init_

3、devices();/ 主循环里没有程序需要执行while(1);这里着重要说明的一点是PD7的外部中断程序。看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。接下来只能另想办法,仔细翻了资料后发现,PD7和PD其他端口不一样,PD7后面拖了个小尾巴TLI,再看手册上的TLI描述,乖乖,TLI拥有芯片最高级别中断,享有独立专用的中断向量号0,这下就好办了,按IAR的规矩,向量号加2,程序改成#pragma vector=0x02,重新来

4、一遍编译、下载、运行,按键终于听话了。IAR+STM8UART串口发送与中断接收2013-03-21 23:22:34|分类:STM8|举报|字号订阅STM8的UART功能强大,除了常规的串口异步通讯外,还拥有LIN主模式、红外编解码器、智能卡模拟等功能。新手还是从基本的串口通讯入手,那些高级功能等熟练以后再慢慢研究吧。i nclude void CLK_init(void)CLK_CKDIVR = 0x08; / 16M内部RC经2分频后系统时钟为8Mvoid UART3_init(void)UART3_BRR2 = 0x01; / 设置波特率9600UART3_BRR1 = 0x34; /

5、 8M/9600 = 0x341UART3_CR2 = 0x2C; / 允许接收中断,允许接收,允许发送#pragma vector=UART3_R_RXNE_vector_interrupt void UART3_RX_RXNE(void)unsigned char c;c = UART3_DR; / 接收到数据了while(!UART3_SR_TXE);c+; / 把接收到的数据加1UART3_DR = c; / 再发回去,为什么这么做?在电脑上串口调试软件里发1就收到2,发A就收到B,看运行结果比较方便void init_devices(void)asm(sim); / 关全局中断CLK

6、_init();UART3_init(); / 开发板上的串口接的是UART3,刚开始想当然的认为UART1,浪费我半个小时asm(rim); / 开全局中断void main( void )init_devices();/ 主循环里没有程序需要执行while(1);IAR+STM8TIM1定时溢出中断2013-03-21 23:20:56|分类:STM8|举报|字号订阅STM8的TIM1是16位高级控制定时器,作为新手不要急着玩高级功能,先从简单的定时溢出中断开始。那么这个简单的目标就定为LED1亮500ms,灭500ms,循环往复,如此而已。i nclude #define LED1_FL

7、ASH PD_ODR_ODR3 = !PD_ODR_ODR3 / 开发板上的LED1接在PD3上void CLK_init(void)CLK_CKDIVR = 0x08; / 16M内部RC经2分频后系统时钟为8Mvoid GPIO_init(void)PD_DDR = 0x08; / 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出void TIM1_init(void)TIM1_PSCRH = 0x1F; / 8M系统时钟经预分频f=fck/(PSCR+1)TIM1_PSCRL = 0x3F; / PSCR=0x1F3F,f=8M/(0x1F3F+1

8、)=1000Hz,每个计数周期1msTIM1_ARRH = 0x01; / 自动重载寄存器ARR=0x01F4=500TIM1_ARRL = 0xF4; / 每记数500次产生一次中断,即500msTIM1_IER = 0x01; / 允许更新中断TIM1_CR1 = 0x01; / 计数器使能,开始计数#pragma vector=TIM1_OVR_UIF_vector_interrupt void TIM1_OVR_UIF(void)LED1_FLASH;TIM1_SR1 = 0; / 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序void init_devices(void)as

9、m(sim); / 关全局中断CLK_init();GPIO_init();TIM1_init();asm(rim); / 开全局中断void main( void )init_devices();/ 主循环里没有程序需要执行while(1);好了,同样编译、下载、运行,看结果吧IAR+STM8系统时钟2013-03-21 23:20:24|分类:默认分类|举报|字号订阅STM8上电运行时默认使用内部16M的RC振荡器经8分频后的2M时钟频率作为系统时钟。程序开始运行后可以通过设置相关寄存器来修改主时钟源,可以选择外部晶振作为主时钟源和CPU时钟分频。那么这里就选择比较简单的操作,修改内部RC

10、时钟预分频器获得8M系统时钟。增加内部RC时钟预分频后的代码如下:i nclude #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 / 开发板上的LED1接在PD3上void delay(unsigned int count)while(count-);void CLK_init(void)CLK_CKDIVR = 0x08; / 16M内部RC经2分频后系统时钟为8Mvoid GPIO_init(void)PD_DDR = 0x08; / 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出void init_d

11、evices(void)CLK_init();GPIO_init();void main( void )init_devices();while(1)delay(50000);LED1_FLASH;IAR+STM8GPIO2013-03-21 23:20:02|分类:STM8|举报|字号订阅第二天,从最基本的IO操作开始学习。在STM上IO绝大多数是GPIO。刚开始学习,测试程序不要搞复杂,越简单越不容易出错。下面是代码,没有使用STM8官方固件库。/ GPIO测试i nclude #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 / 开发板上的LED

12、1接在PD3上void delay(unsigned int count)while(count-);void GPIO_init(void)PD_DDR = 0x08; / 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出void init_devices(void)GPIO_init();void main( void )init_devices();while(1)delay(50000);LED1_FLASH;IAR+STM8ADC模数转换器2013-03-21 23:23:47|分类:STM8|举报|字号订阅今天有空来继续写学习笔记。STM8片

13、上集成了10位逐次比较型模数转换器,在开发板上有个电位器接到了AIN3,但没有可以显示数据的LED数码管或LCD液晶显示屏,怎么办呢?通过前面的学习,这个问题不难解决,在这里可以把AD采集数据通过UART发送到电脑上显示。i nclude void CLK_init(void)CLK_CKDIVR = 0x08; / 16M内部RC经2分频后系统时钟为8Mvoid GPIO_init(void)PD_DDR = 0x08; / 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出PD_CR2 = 0x80; / 使能PD7外部中断void EXTI_init

14、(void)EXTI_CR1 = 0x80; / PD口下降沿触发中断#pragma vector=0x02_interrupt void EXTI_PD7_TLI(void)unsigned int value;ADC_CSR &= 0x80; / 清除EOC转换结束标志ADC_CR1 |= 0x01; / 开始单次转换while(!(ADC_CSR&0x80); / 等待单次转换完成value = (int)ADC_DRH8;void ADC_init(void)ADC_CSR = 0x03; / ADC输入引脚AIN3ADC_CR1 = 0x01; / ADC开启void UART3_i

15、nit(void)UART3_BRR2 = 0x01;UART3_BRR1 = 0x34; / 8M/9600 = 0x341UART3_CR2 = 0x0C; / 允许接收,允许发送void init_devices(void)asm(sim);CLK_init();GPIO_init();EXTI_init();ADC_init();UART3_init();asm(rim);void main( void )init_devices();/ 主循环里没有程序需要执行while(1);在本例中仅使用了ADC的单次转换模式,每按一次按键进行一次AD转换,并把转换结果通过UART发送,这样可以

16、在电脑上通过超级终端或串口调试软件查看数据。通过这次测试,还发现一个现象,如果把清除EOC转换结束标志放在读取数据之后,那么在下次启动单次转换后,EOC标志位会自动置位,此时必须人为的等待7us后才能读到正确的数据,否则只能读到上一次的转换数据,可能这是STM8的ADC与其他MCU不同之处。IAR+STM8PWM2013-03-21 23:24:19|分类:STM8|举报|字号订阅开发板上的LED1接在了PD3上,而PD3复用功能是TIM2_CC2,正好可以用来测试PWM功能。当然板上的另外2个LED也可以用,LED2对应PD2/TIM3_CC1,LED3对应PD0/TIM3_CC2。本例程通

17、过电位器来调整LED1的亮度。i nclude void CLK_init(void)CLK_CKDIVR = 0x08; / 16M内部RC经2分频后系统时钟为8Mvoid GPIO_init(void)PD_DDR = 0x08; / 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; / 设置PD3为推挽输出void TIM2_init(void)TIM2_CCMR2 = 0x70; / PWM 模式 2TIM2_CCER1 = 0x30; / CC2配置为输出TIM2_ARRH = 0x03; / 配置PWM分辨率为10位,ARR=0x3FFTIM2_ARRL = 0xFF

18、; / PWM频率=8M/0x03FF=7820HzTIM2_CR1 = 0x01; / 计数器使能,开始计数void ADC_init(void)ADC_CSR = 0x03; / ADC输入引脚AIN3ADC_CR1 = 0x01; / ADC开启Run(void)unsigned int value;ADC_CSR &= 0x80; / 清除EOC转换结束标志ADC_CR1 |= 0x01; / 开始单次转换while(!(ADC_CSR&0x80); / 等待单次转换完成value = (int)ADC_DRH8); / 更新CC2比较寄存器TIM2_CCR2L = (unsigned char)(value);void init_devices(void)asm(sim);CLK_init();GPIO_init();TIM2_init();ADC_init();asm(rim);void mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论