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