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