日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm8s 定时器1 延时_试了一下STM8S定时器TIM2的使用

發(fā)布時間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm8s 定时器1 延时_试了一下STM8S定时器TIM2的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

昨日快下班的時候抽空調了手頭的三合一體驗套裝,目標明確,直奔TIM2而去。翻了翻STM8S Reference Manual,感覺TIM1不好對付,先從簡單的TIM2下手。讓LED循環(huán)亮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,計數(shù)1000

TIM2_CR1 |=0x81;?// 使能TIM2計數(shù)??? 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,只好根據(jù)現(xiàn)象去改TIM2_ARR的值,心想我定1s你亮4s,那我就TIM2_ARR =0x00F9,計數(shù)250個總該可以吧。一試還真的可以。不過這讓我更想不通了,8MHz外部晶振到CPU是不分頻,而fMASTER到TIM2是8分頻,也就是剛好產(chǎn)生了1us的時鐘基準。晚上想起來是沒配置主時鐘的緣故,沒配置就默認使用了HSI 2MHz的 RC振蕩器,結果還是把它8分頻,定時時間相差4倍就不稀奇了。到此,問題基本了結。上面的代碼是完整的正確代碼。不過有個BUG,那就是如果HSE故障,那可憐的STM8S就會傻傻地一直在哪兒等著,這個問題還沒解決,初步想法是交給中斷去處理。

總結

以上是生活随笔為你收集整理的stm8s 定时器1 延时_试了一下STM8S定时器TIM2的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。