stm8s 定时器1 延时_试了一下STM8S定时器TIM2的使用
昨日快下班的時候抽空調了手頭的三合一體驗套裝,目標明確,直奔TIM2而去。翻了翻STM8S Reference Manual,感覺TIM1不好對付,先從簡單的TIM2下手。讓LED循環亮1s滅1s吧,寫了程序如下:
/*************************
**文件名稱:main.c
**LED說明:LD2----PD3
**?????????LD3----PD2
**???????? LD4----PD0
**外部晶振:8MHz
**************************/
#include"stm8s105c_s.h"
void CLK_Init(void)
{
CLK_ECKR |=0x01;??? // 開啟外部時鐘
while(!(CLK_ECKR &0x02));??? // 等待HSE準備就緒
CLK_CKDIVR &=0xF8;??? // CPU時鐘不分頻
CLK_SWR =OxB4;?? // 選擇外部時鐘
while(!(CLK_SWCR &0x08));??? // 等待切換至HSE完成(STM8默認上電使用HSI)
CLK_SWCR |=0x02;??? // 使能HSI
}
void GPIO_Init(void)
{
PD_DDR |=0x0D;
PD_CR1 |=0x0D;?// 配置PD0、PD2、PD3為推挽輸出??? PD_CR2? =0x00;?// 擺率2MHz}
void TIM2_Init(void)
{
TIM2_PSCR?=0x03;?// TIM2的時鐘頻率=fCK_PSC/2^3,即8分頻,得到1us時基??? TIM2_ARRH =0x03;
TIM2_ARRL =0xE7;?// TIM2_ARR初值設定為0x03e7=999,計數1000
TIM2_CR1 |=0x81;?// 使能TIM2計數??? TIM2_IER? =0x01;?// 允許TIM2溢出中斷}
main()
{
_asm("sim");?//?禁止中斷??? CLK_Init();
GPIO_Init();
TIM2_Init();
_asm("rim");??// 開啟中斷???while(1);
}
/************************************************
**文件名稱:stm8s_interrupt_verctor.c
**說明:以下內容為加入的部分,模板代碼部分省略
*************************************************/
#include"stm8s105c_s.h"
// 代碼省略
unsigned?int count =0;
@far @interrupt void TIM2_1US(void)
{
count++;
TIM2_SR1 &=~(0x01);??? // 清除TIM2溢出中斷標志位
if(count ==1000)??? // 1s時間到??? {
count =0;
PD_ODR ^=0x0D;??// LED翻轉???? }
return;
}
// TIM2在中斷向量表中的定義
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext},/* reset */?{0x82, NonHandledInterrupt}, /* trap? */?{0x82, NonHandledInterrupt}, /* irq0? */?{0x82, NonHandledInterrupt}, /* irq1? */?{0x82, NonHandledInterrupt},/* irq2? */?{0x82, NonHandledInterrupt},/* irq3? */?{0x82, NonHandledInterrupt}, /* irq4? */?{0x82, NonHandledInterrupt}, /* irq5? */?{0x82, NonHandledInterrupt}, /* irq6? */?{0x82, NonHandledInterrupt}, /* irq7? */?{0x82, NonHandledInterrupt}, /* irq8? */?{0x82, NonHandledInterrupt}, /* irq9? */?{0x82, NonHandledInterrupt},/* irq10 */?{0x82, NonHandledInterrupt}, /* irq11 */?{0x82, NonHandledInterrupt}, /* irq12 */?{0x82, TIM2_1US},??????????? /* irq13 */?{0x82, NonHandledInterrupt},/* irq14 */?{0x82, NonHandledInterrupt}, /* irq15 */
// 以下內容省略
{0x82, NonHandledInterrupt}, /* irq29 */?? // 手冊中的32個中斷向量,這里才29個,因為用的是STM8S105S4這款片子的原因,可能沒那么多吧,cosmic真的很傻很強大。順便了解了TIM2的中斷級別也不錯。
};
調試中遇到的問題一開始讓我迷茫:LED亮4s滅4s,只好根據現象去改TIM2_ARR的值,心想我定1s你亮4s,那我就TIM2_ARR =0x00F9,計數250個總該可以吧。一試還真的可以。不過這讓我更想不通了,8MHz外部晶振到CPU是不分頻,而fMASTER到TIM2是8分頻,也就是剛好產生了1us的時鐘基準。晚上想起來是沒配置主時鐘的緣故,沒配置就默認使用了HSI 2MHz的 RC振蕩器,結果還是把它8分頻,定時時間相差4倍就不稀奇了。到此,問題基本了結。上面的代碼是完整的正確代碼。不過有個BUG,那就是如果HSE故障,那可憐的STM8S就會傻傻地一直在哪兒等著,這個問題還沒解決,初步想法是交給中斷去處理。
總結
以上是生活随笔為你收集整理的stm8s 定时器1 延时_试了一下STM8S定时器TIM2的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [易飞]易飞ERP系统权限管理之信息控制
- 下一篇: 十秒钟入门一分钟搭建Discuz论坛