標(biāo)題: STM8S資源配置(寄存器版本)(STVD+COSMIC編譯環(huán)境) [打印本頁]
作者: xiaos 時間: 2015-4-10 17:05
標(biāo)題: STM8S資源配置(寄存器版本)(STVD+COSMIC編譯環(huán)境)
1. IO口: 寄存器(X=A,B,C,D...)
PX_DDR: 輸入輸出狀態(tài)配置 1:輸出,0:輸入.
PX_CR1: 輸出時 1:推挽輸出 ,0:開漏輸出.輸入時 1:上拉輸入,0:浮空輸入.
PX_CR2: 輸出時 1:以10MHz的速度輸出,0:以2MHz的速度輸出.輸入時 1:開啟中斷功能,0:禁止中斷.
PX_ODR: 輸出狀態(tài)寄存器 向其寫1 對應(yīng)的IO口則輸出高電位,寫0則輸出低電位.
PX_IDR: 讀狀態(tài)寄存器,讀出的結(jié)果為1 則對應(yīng)IO口為高電位,為0則為低電位.
2.時鐘:(CLK)
STM8S剛上電的時候運行的時鐘是內(nèi)部的高速RC振蕩器的8分頻(HSI/8)(16MHZ/8=2MHZ),其內(nèi)部還有一個低速的RC振蕩器 (LSI).用戶還可以外接一個最大值為24MHZ的外部晶振作為時鐘(HSE).可以通過軟件編程來改變系統(tǒng)的主時鐘.
CLK寄存器(CLK寄存器還有很多,涉及到時鐘切換的就這幾個就可以了)
CLK_CKDIVR: 低3位保存CPU時鐘的分頻因子(設(shè)低3位的值為x 那么分頻因子就是2^x),第3位和第4位是HSI時鐘的分頻因子;其余位保留.
CLK_SWCR:[0](SWBSY)時鐘切換忙判斷位(沒切換完成為1,切換完成為0),[1](SWEN)時鐘切換啟動位 1啟動切換 0 禁止切換.[2](SWIEN)時鐘切換中斷選擇位 1:開啟時鐘切換中斷,0:不開啟.
CLK_SWR: 時鐘源選擇寄存器,給這個寄存器賦值為 0xe1:主時鐘為內(nèi)部高速振蕩器,0xd2:主時鐘為內(nèi)部低速振蕩器,0xb4:外部高速振蕩器.
{ //時鐘切換例子 從HSI/8切換為HSE
//CLK_CKDIVR=0;//分頻銀子設(shè)置為0
CLK_SWR=0xb4;//選擇時鐘源
CLK_SWCR&=~(1<<2);//關(guān)閉切換中斷
CLK_SWCR|=(1<<1);//啟動切換
while(CLK_SWBSY&(1<<0)==1);//等待切換完成
}
3.串口(UART) STM8S可能有很多串口,這里只講UART1
與串口1配置相關(guān)的寄存器:
CLK_PCKENR1:這個寄存器的第2位是UART1的時鐘啟動位,1:啟動,0:關(guān)閉
UART1_CR2:[2]:接收使能位(1:使能,0失能),[3]:發(fā)送使能位(1:使能,0失能),[5]接收中斷使能位(1:使能,0失能),[6]發(fā)送完成中斷使能位(1:使能,0失能),[7]發(fā)送中斷使能位(1:使能,0失能).
UART1_CR3:UART1模式選擇寄存器[5:4]停止位個數(shù)選擇 00:1個停止位,01:保留,10:2個停止位,11:1.5個停止位
UART1_CR1:[1]
奇偶校驗選擇位 1:奇校驗,0:偶校驗.[2]奇偶校驗使能位 1:使能,0失能. [4]字長選擇位 1: 1個起始位 9個數(shù)據(jù)位 1個停止位,
0:一個起始位 8個數(shù)據(jù)位,UART1_CR3[5:4]個停止位.[5] UART1啟動位 0:啟動 1:關(guān)閉
UART1_BRR2:波特率選擇寄存器2,波特率的值=主時鐘頻率/分頻因子.分頻因子就是這兩個寄存器的值.比如分頻因子為0xABCD 那么UART1_BRR2=0xAD,UART1_BRR1=0xBC.
UART1_BRR1:波特率選擇寄存器1
給這兩個寄存器賦值的時候要先給UART1_BRR2 賦值.在給UART1_BRR1賦值,因為給UART1_BRR1賦值完成的時候波特率就已經(jīng)決定好了,再給UART1_BRR2 賦值就沒有意義了.
{ //UART1配置例子(開啟收發(fā),開啟接受中斷 關(guān)閉發(fā)送中斷)
#define BRR 9600//定義波特率(修改波特率只需要修改這個宏的值就可以了)
#define Fosc 16000000 //定義CPU頻率
#define BRR1 (((Fosc)/(BRR))>>4)
#define BRR2 (((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f))
CLK_PCKENR1|=1<<2;//開啟UART1時鐘
UART1_CR2&=~(1<<2);//先關(guān)閉接收
UART1_CR2&=~(1<<3);//先關(guān)閉發(fā)送
UART1_BRR2=BRR2;//設(shè)置波特率 先給BRR2賦值在給BRR1賦值
UART1_BRR1=BRR1;
UART1_CR1&=~(1<<2);//不使用奇偶校驗
UART1_CR1&=~(1<<4);//選擇1個起始位 8個數(shù)據(jù)位
UART1_CR3&=~(1<<4);//選擇1個停止位
UART1_CR3&=~(1<<5);//選擇1個停止位
UART1_CR2&=~(1<<6);//不使用發(fā)送中斷
UART1_CR2|=(1<<5);//使用接收中斷
UART1_CR1&=~(1<<5);//啟動UART1
UART1_CR2|=(1<<2);//啟動接收
UART1_CR2|=(1<<3);//啟動發(fā)送
}
4:定時器(TIM4)
ST的單片機無論是STM32還是STM8S他的定時器的功能非常強大.強大的功能必然伴隨著配置更加復(fù)雜.我這里先學(xué)容易一些的定時器TIM4.
TIM4的寄存器:
TIM4_IER:與中斷有關(guān)的寄存器 [0] 設(shè)置為1時開啟更新中斷,設(shè)置為0時關(guān)閉
TIM4_PSCR:計數(shù)器的分頻因子 計數(shù)器的頻率=時鐘源頻率/TIM4_PSCR[2:0]
TIM4_ CNTR:計數(shù)器 從TIM4_CNTR的值計數(shù)到255 然后從新從TIM4_ARR處開始計數(shù)
TIM4_ARR:
TIM4_EGR:事件產(chǎn)生寄存器 [0]設(shè)置為1時 有更新事件 為0時無更新事件
TIM4_CR1:[0] 為1時 開啟TIM4的計數(shù)器,否則關(guān)閉TIM4的計數(shù)器
TIM4_SR: [0]更新事件標(biāo)準(zhǔn)位,中斷處理函數(shù)里面要將其請0
{ //TIM4設(shè)置例子
#define PERIOD 100
#define ARR ((0xff)-(PERIOD))
TIM4_IER=0x00;//關(guān)閉所有中斷
TIM4_PSCR=0x04;//計數(shù)器頻率=16MHZ/2^4;
TIM4_CNTR=ARR;
TIM4_ARR=ARR;
TIM4_EGR|=(1<<0);//產(chǎn)生更新事件
TIM4_CR1|=(1<<0);//開啟TIM4的計數(shù)器
TIM4_SR&=~(1<<0);// 清除中斷標(biāo)志
TIM4_IER|=(1<<0);// 開啟更新中斷
}
5.使用TIM3的PWM功能
與PWM(OC1)功能有關(guān)的寄存器
TIM3_CCMR1:模式選擇[6:4]
TIM3_CCER1:該寄存器的[0]為1時啟動PWM 否則關(guān)閉
TIM3_CCR1L:比較寄存器低位
TIM3_CCR1H:比較寄存器高位
當(dāng)TIM3_CNT寄存器的值小于TIM3_CCR1寄存器時OC1輸出的電平和TIM3_CNT大于TIM3_CCR1時的電平不一樣(至于究竟是什么電平跟模式有關(guān))從而電位出現(xiàn)高低高低的變化,調(diào)節(jié) TIM3_CCR1/TIM3_ARR的比值可以調(diào)節(jié)占空比
{ //TIM3_PWM演示
TIM3_ARRL=100;
TIM3_ARRH=0;
TIM3_CCR1L=50;
TIM3_CCR1H=0; //占空比=50/100=0.5
TIM3_PSCR=4; //16/2^4=1 分頻
TIM3_CCMR1|=0x70;//設(shè)置為PWM2模式
TIM3_CCER|=0x01;//啟動PWM輸出
TIM3_CR1|=0x01;//啟動計數(shù)器
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |