IARFORSTM8例程要点总结计划.docx
- 文档编号:6895473
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:19
- 大小:19.04KB
IARFORSTM8例程要点总结计划.docx
《IARFORSTM8例程要点总结计划.docx》由会员分享,可在线阅读,更多相关《IARFORSTM8例程要点总结计划.docx(19页珍藏版)》请在冰豆网上搜索。
IARFORSTM8例程要点总结计划
IAR+STM8——EXTI外面中断控制寄存器
2013-03-2123:
23:
15|分类:
STM8|举报|字号订阅
这块三合一的开发板上有且只有一个按键,没方法,就拿这唯一的按键来用吧。
吸取前面
UART3
的教训,先看开发板的原理图吧。
这个按键被接到了
STM8S207SB
的
PD7
上,已做了上拉办理。
为了简单了然,还是点
LED1
吧。
按一下LED1亮,再按一下
LED1
灭。
好了,写程序吧。
include
#defineLED1_FLASHPD_ODR_ODR3=!
PD_ODR_ODR3//开发板上的
LED1接在PD3上
voidGPIO_init(void)
{
PD_DDR=0x08;//
配置
PD
端口的方向寄存器
PD3
输出
PD_CR1=0x08;//
设置
PD3
为推挽输出
PD_CR2=0x80;//
使能
PD7
外面中断
}
voidEXTI_init(void)
{
EXTI_CR1=0x80;//PD口下降沿触发中断
}
#pragmavector=0x02//这里很要点!
看下面说明。
__interruptvoidEXTI_PD7_TLI(void)
{
LED1_FLASH;
}
voidinit_devices(void)
{
asm("sim");//关全局中断
GPIO_init();
EXTI_init();
asm("rim");//开全局中断
}
voidmain(void)
{
init_devices();
主循环里没有程序需要执行
while
(1);
}
这里重视要说明的一点是PD7的外面中断程序。
看了一下芯片手册,PD口外面中断EXTI3的中断向量号是6,想自然,又是想自然,按IAR的规矩中断
向量要加2,就这样写#pragmavector=0x08,结果就是按下按键,程序没响应
了,素来在中断里不出来。
接下来只能另想方法,仔细翻了资料后发现,PD7
和PD其他端口不同样,PD7后边拖了个小尾巴TLI,再看手册上的TLI描述,
乖乖,TLI拥有芯片最高等别中断,享有独立专用的中断向量号0,这下就好办
了,按IAR的规矩,向量号加2,程序改成#pragmavector=0x02,重新来一遍编译、下载、运行,按键终于听话了。
IAR+STM8——UART串口发送与中断接收
2013-03-2123:
22:
34|分类:
STM8|举报|字号订阅
STM8的UART功能富强,除了老例的串口异步通讯外,还拥有LIN主模
式、红外编解码器、智能卡模拟等功能。
新手还是从基本的串口通讯下手,那些高级功能等熟练今后再慢慢研究吧。
include
voidCLK_init(void)
{
CLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8M
}
voidUART3_init(void)
{
UART3_BRR2=0x01;//设置波特率9600
UART3_BRR1=0x34;//8M/9600=0x341
UART3_CR2=0x2C;//赞同接收中断,赞同接收,赞同发送
}
#pragmavector=UART3_R_RXNE_vector
__interruptvoidUART3_RX_RXNE(void)
{
unsignedcharc;
c=UART3_DR;//接收到数据了
while(!
UART3_SR_TXE);
c++;//
把接收到的数据加
1
UART3_DR=c;//
再发回去,为什么这么做?
在电脑上串口调试软件里发
1就
收到
2,发
A就收到
B,看运行结果比较方便
}
voidinit_devices(void)
{
asm("sim");//关全局中断
CLK_init();
UART3_init();//开发板上的串口接的是
UART3,刚开始想自然的认为
UART1,
浪费我半个小时
asm("rim");//开全局中断
}
voidmain(void)
{
init_devices();
主循环里没有程序需要执行
while
(1);
}
IAR+STM8——TIM1准时溢出中断
2013-03-2123:
20:
56|分类:
STM8|举报|字号订阅
STM8的TIM1是16位高级控拟定时器,作为新手不要急着玩高级功能,先从
简单的准时溢出中断开始。
那么这个简单的目标就定为LED1亮500ms,灭
500ms,循环往复,这样而已。
include
#defineLED1_FLASHPD_ODR_ODR3=!
PD_ODR_ODR3//开发板上的
LED1接在PD3上
voidCLK_init(void)
{
CLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8M
}
voidGPIO_init(void)
{
PD_DDR=0x08;//
配置
PD
端口的方向寄存器
PD3
输出
PD_CR1=0x08;//
设置
PD3
为推挽输出
}
voidTIM1_init(void)
{
TIM1_PSCRH=0x1F;//8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL=0x3F;//PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz
,每个计
数周期1ms
TIM1_ARRH=0x01;//
TIM1_ARRL=0xF4;//
TIM1_IER=0x01;//
TIM1_CR1=0x01;//
}
自动重载寄存器ARR=0x01F4=500
每记数500次产生一次中断,即500ms
赞同更新中断
计数器使能,开始计数
#pragmavector=TIM1_OVR_UIF_vector
__interruptvoidTIM1_OVR_UIF(void)
{
LED1_FLASH;
TIM1_SR1=0;//除去更新中断标志,这步不能够遗漏,否则会连续进入中断程序
}
voidinit_devices(void)
{
asm("sim");//关全局中断
CLK_init();
GPIO_init();
TIM1_init();
asm("rim");//开全局中断
}
voidmain(void)
{
init_devices();
主循环里没有程序需要执行
while
(1);
}
好了,同样编译、下载、运行,看结果吧
IAR+STM8——系统时钟
2013-03-2123:
20:
24|分类:
默认分类|举报|字号订阅
STM8上电运行时默认使用内部16M的RC振荡器经8分频后的2M时钟频率作为系统时钟。
程序开始运行后能够经过设置相关寄存器来更正主时钟源,能够选择外面晶振作为主时钟源和CPU时钟分频。
那么这里就选择比较简单的操作,更正内部RC时钟预分频器获得8M系统时钟。
增加内部RC时钟预分频后的代码以下:
include
#defineLED1_FLASHPD_ODR_ODR3=!
PD_ODR_ODR3//开发板上的LED1接在PD3上
voiddelay(unsignedintcount)
{
while(count--);
}
voidCLK_init(void)
{
CLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8M
}
voidGPIO_init(void)
{
PD_DDR=0x08;//
配置
PD
端口的方向寄存器
PD3
输出
PD_CR1=0x08;//
设置
PD3
为推挽输出
}
voidinit_devices(void)
{
CLK_init();
GPIO_init();
}
voidmain(void)
{
init_devices();
while
(1)
{
delay(50000);
LED1_FLASH;
}
}
IAR+STM8——GPIO
2013-03-2123:
20:
02|分类:
STM8|举报|字号订阅
第二天,从最基本的IO操作开始学习。
在STM上IO绝大多数是GPIO。
刚开始学习,测试程序不要搞复杂,越简单越不简单出错。
下面是代码,没有使用STM8官方固件库。
//GPIO测试
include
#defineLED1_FLASHPD_ODR_ODR3=!
PD_ODR_ODR3//开发板上的LED1接在PD3上
voiddelay(unsignedintcount)
{
while(count--);
}
voidGPIO_init(void)
{
PD_DDR=0x08;//
配置
PD
端口的方向寄存器
PD3
输出
PD_CR1=0x08;//
设置
PD3
为推挽输出
}
voidinit_devices(void)
{
GPIO_init();
}
voidmain(void)
{
init_devices();
while
(1)
{
delay(50000);
LED1_FLASH;
}
}
IAR+STM8——ADC模数变换器
2013-03-2123:
23:
47|分类:
STM8|举报|字号订阅
今天有空来连续写学习笔录。
STM8片上集成了10位逐次比较型模数变换
器,在开发板上有个电位器接到了AIN3,但没有能够显示数据的LED数码管或
LCD液晶显示屏,怎么办呢?
经过前面的学习,这个问题不难解决,在这里能够把AD采集数据经过UART发送到电脑上显示。
include
voidCLK_init(void)
{
CLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8M
}
voidGPIO_init(void)
{
PD_DDR=0x08;//
PD_CR1=0x08;//
PD_CR2=0x80;//
配置设置使能
PD端口的方向寄存器
PD3为推挽输出
PD7外面中断
PD3
输出
}
voidEXTI_init(void)
{
EXTI_CR1=0x80;//PD口下降沿触发中断
}
#pragmavector=0x02
__interruptvoidEXTI_PD7_TLI(void)
{
unsignedintvalue;
ADC_CSR&=~0x80;//除去EOC变换结束标志
ADC_CR1|=0x01;//开始单次变换
while(!
(ADC_CSR&0x80));//等待单次变换完成
value=((int)ADC_DRH<<2);//先读高8位,默认设置数据左对齐
value|=ADC_DRL;//再读低8位
while(!
UART3_SR_TXE);
UART3_DR=value;//经过UART3发送AD采样结果
while(!
UART3_SR_TXE);
UART3_DR=value>>8;
}
voidADC_init(void)
{
ADC_CSR=0x03;//ADC输入引脚AIN3
ADC_CR1=0x01;//ADC开启
}
voidUART3_init(void)
{
UART3_BRR2=0x01;
UART3_BRR1=0x34;//8M/9600=0x341
UART3_CR2=0x0C;//赞同接收,赞同发送
}
voidinit_devices(void)
{
asm("sim");
CLK_init();
GPIO_init();
EXTI_init();
ADC_init();
UART3_init();
asm("rim");
}
voidmain(void)
{
init_devices();
主循环里没有程序需要执行
while
(1);
}
在本例中仅使用了ADC的单次变换模式,每按一次按键进行一次AD变换,并
把变换结果经过UART发送,这样能够在电脑上经过超级终端或串口调试软件查察数据。
经过此次测试,还发现一个现象,若是把除去EOC变换结束标志放在读取数据此后,那么在下次启动单次变换后,EOC标志位会自动置位,此时必定人为的等待7us后才能读到正确的数据,否则只能读到前一次的变换数据,可能这是
STM8的ADC与其他MCU不一样之处。
IAR+STM8——PWM
2013-03-2123:
24:
19|分类:
STM8|举报|字号订阅
开发板上的LED1接在了PD3上,而PD3复用功能是TIM2_CC2,正好能够用来测试PWM功能。
自然板上的别的2个LED也能够用,LED2对应PD2/TIM3_CC1,LED3对应PD0/TIM3_CC2。
本例程经过电位器来调整LED1
的亮度。
include
voidCLK_init(void)
{
CLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8M
}
voidGPIO_init(void)
{
PD_DDR=0x08;//PD_CR1=0x08;//
配置设置
PD端口的方向寄存器
PD3为推挽输出
PD3
输出
}
voidTIM2_init(void)
{
TIM2_CCMR2=0x70;//PWM模式2
TIM2_CCER1=0x30;//CC2配置为输出
TIM2_ARRH=0x03;//配置PWM分辨率为10位,ARR=0x3FF
TIM2_ARRL=0xFF;//PWM频率=8M/0x03FF=7820Hz
TIM2_CR1=0x01;//计数器使能,开始计数
}
voidADC_init(void)
{
ADC_CSR=0x03;//ADC输入引脚AIN3
ADC_CR1=0x01;//ADC开启
}
Run(void)
{
unsignedintvalue;
ADC_CSR&=~0x80;//除去EOC变换结束标志
ADC_CR1|=0x01;//开始单次变换
while(!
(ADC_CSR&0x80));//等待单次变换完成
value=((int)ADC_DRH<<2);//先读高8位,默认设置数据左对齐
value|=ADC_DRL;//再读低8位
TIM2_CCR2H=(unsignedchar)(value>>8);//更新CC2比较寄存器TIM2_CCR2L=(unsignedchar)(value);}
voidinit_devices(void)
{
asm("sim");
CLK_init();
GPIO_init();
TIM2_init();
ADC_init();
asm("rim");
}
voidmain(void)
{
init_devices();
while
(1)Run();
}
STM8互补PWMTIM1准时器输出成功
2014-10-2215:
11:
50|分类:
STM8|举报|字号订阅
程序测试:
#include
voidPWM_INIT()
{
CLK_PCKENR1|=0x80;//开启准时器1外设时钟
TIM1_EGR|=0x01;//重新初始化TIM1
TIM1_CR1=0x00;//B7(0)能够直接写入B65(00)边缘对齐模式
上计数B3(0)计数器不停止发生更新事件
TIM1_RCR=0x00;
TIM1_PSCRH=0;//设定预分频为,16分频1M
TIM1_PSCRL=0x80;//PWM的时钟影响周期
TIM1_CCER1=0x0F;//CC2ER1开启1,2,高电平有效
TIM1_CCMR1=0x60;//PWM模式1,CC1配置入输出
TIM1_ARRH=0;//设定重装载值
TIM1_ARRL=0xFF;//PWM的周期
TIM1_CCR1H=0;
TIM1_CCR1L=0x80;//占空比值
TIM1_CR1|=0x01;//使能TIM1计数器
TIM1_BKR|=0x80;
B4(0)向
}
voidmain()
{
PWM_INIT();
while
(1);
}
特别重要注意,芯片的Option配置AFR7和AFR0更正以以下图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IARFORSTM8 例程 要点 总结 计划