最近有個小東西用到STM8S來驅動,之前用STM8S使用的是內部自帶的16MHz RC時鐘,尚未嘗試過使用外部晶振作為主時鐘。今天記錄一下使用外部晶振時遇到的一個問題。
老規矩,在進行程序設計時,首先初始化時鐘,本次使用的是STM8S103F3P6芯片,8MHz的外部晶振,為了方便內外部時鐘切換,結合資料寫了兩個切換函數
/***********************************************
*描述:采用內部16MHz的RC時鐘為主時鐘
* 初始化時鐘為1分頻 16M,無外部晶振
*版本:V1.0
*作者:
************************************************/
void HsiInit(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
}
/***********************************************
*描述:采用8M外部晶振為主時鐘,用于時鐘切換
*版本:V1.0
*作者:
************************************************/
void HseInit(void)
{
CLK_DeInit(); //時鐘初始化
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //8MHz,不分頻
CLK_HSECmd(ENABLE); //外部時鐘開
CLK_HSICmd(ENABLE); //內部RC開
while(SET != CLK_GetFlagStatus(CLK_FLAG_HSERDY)); //等待外部晶振起振
CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL,CLK_SOURCE_HSE,DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);
CLK_ClockSwitchCmd(ENABLE); //開始切換
}
在主函數調用所需的時鐘函數即可,為了驗證外部時鐘是否切換成功,我在定時器1的通道1輸出PWM進行驗證,所幸得到了想要的波形,定時器1的配置如下
/***********************************************
*描述:TIM1CH1(PC6)輸出PWM,頻率為1K
* 定時器時鐘為外部的8MHz
*版本:V1.0
*作者:
************************************************/
void TIM1_Init(void)
{
TIM1->EGR = 0x01;//重新初始化定時器1
TIM1->CR1 = 0x00;//邊沿對齊方式,向上計數,發生更新事件,計數器不停止更新
TIM1->RCR = 0x00;//重復計數器的值為0,計時時間到,重復多少次產生中斷,該值是重復多少次那個值
//設定預分頻為,80分頻 8M
TIM1->PSCRH =0x00; //PWM的時鐘 影響周期
TIM1->PSCRL =0x4f; //80分頻,TIM1的時鐘為100K
TIM1->ARRH = 0x00; //設定重裝載值
TIM1->ARRL = 0x63; //計數100次,等于T,即1ms(f=1K),每10us計一個數
//CH1
TIM1->CCER1 = 0x01; //CC2ER1開啟CH1,CC1配置入輸出,低電平有效
TIM1->CCMR1 = 0x68; //PWM模式1,使能預裝載
//設置占空比
TIM1->CCR1H = 0x00;
TIM1->CCR1L = 0x0A; // 占空比值
TIM1->OISR &= ~0x03;
TIM1->BKR |= 0x80; //剎車
TIM1->CR1 |= 0x01; //使能TIM1計數器
// GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIOC->DDR|=0xff;//輸出
GPIOC->CR1|=0xff;//推挽
GPIOC->CR2|=0xf0;//速度
}
接下來開始進入本次主題,采用8MHz外部時鐘時,串口1傳輸數據異常。開始時串口初始化函數如下,使用波特率是9600
void Uart1_Init(u32 Baudrate)
{
UART1_DeInit();
UART1_Init((u32)Baudrate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_Cmd(ENABLE ); //啟用串口
}
如果使用的是內部的16MHz時鐘,這三行初始化代碼應該可以啟動串口傳輸數據,但是我發現數據在傳輸的過程中出錯,剛開始也懷疑是串口配置出錯,假如配置出錯,理論上是不會收到數據的,上面的代碼能在內部時鐘下正常傳輸數據,在外部時鐘下傳輸出錯,那很大可能就是波特率出現了問題。
串口初始化的波特率是9600,串口調試助手在9600的波特率下得不到正確的數據,printf打印出來的是亂碼
啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤
槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff
啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤
槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff
啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤
槝灅?榾ff啒f槝驤槝灅?榾ff啒f槝驤槝灅?榾ff
當我把串口調試助手的波特率改為4800后,神奇的一幕出現了
ART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
UART1 is OK!
為什么呢?很好奇發生了什么,我把波特率兩個寄存器值打印出來
UART1->BRR2: 2
UART1->BRR1: 68
UART1->BRR2: 2
UART1->BRR1: 68
UART1->BRR2: 2
UART1->BRR1: 68
UART1->BRR2: 2
UART1->BRR1: 68
結合STM8S參考手冊,將這兩個寄存器的值還原,得到UART_DIV = 0x0682,十進制就是UART_DIV = 1666,按照公式:
UART_DIV = F / Baudrate,其中F是主時鐘頻率,Baudrate是波特率,為9600
那么主時鐘頻率 = 1666 * 9600 = 15993600,接近16MHz,通過上面可以觀察到,UART_DIV = 1666對應的是16MHz,那么8MHz應該為多少?
UART_DIV = 8000 000 / 9600 = 833.3,即UART_DIV = 0x0341
參考數據手冊的設置規則,BRR1和BRR2的值應該為
UART1->BRR2 = 0x01;
UART1->BRR1 = 0x34;
所以串口初始化函數應該為(注意必須是先設置BRR2,再設置BRR1)
void Uart1_Init(u32 Baudrate)
{
UART1_DeInit();
UART1_Init((u32)Baudrate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1->BRR2 = 0x01;
UART1->BRR1 = 0x34;
UART1_Cmd(ENABLE ); //啟用串口
}
此時,再將串口調試助手的波特率設置為9600,可以得到如下數據
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
UART1->BRR2: 1
UART1->BRR1: 34
至此,串口調試完成,引起傳輸數據出錯,應該是庫函數計算波特率是以內部的16MHz頻率作為標準,假如你要用到其他頻率,需要重新設置BRR1和BRR2這兩個寄存器的值。
上一篇:STM8S的按鍵PWM調光燈歷程
下一篇:使用STM8S003K3 ADC簡介以及初始化
推薦閱讀
史海拾趣
為了加強與芯片設計領域的合作,Einfochips公司加入了Tensilica公司的Xtensions設計伙伴計劃。作為計劃的一部分,Einfochips將為采用Tensilica的Xtensa可配置處理器以及Diamond Standard處理器內核的SoC設計提供服務。這一合作不僅提升了Einfochips在SoC設計領域的技術實力,還為其帶來了更多的商業機會。
隨著全球環保意識的提高,DMEL Inc積極響應綠色環保的號召。公司加大了對環保技術的研發和應用力度,推出了一系列綠色、環保的產品。同時,DMEL Inc還注重生產過程中的節能減排工作,采用了先進的生產工藝和環保材料。這些措施的實施不僅提升了公司的環保形象也為企業帶來了可持續發展的動力。
隨著電子行業的快速發展,集成電路測試成為了ABI Electronics公司新的增長點。ABI團隊針對集成電路的復雜性和多樣性,開發出了先進的集成電路測試儀。該測試儀具備高精度、高可靠性、高自動化等特點,能夠快速準確地檢測集成電路的性能和故障,為集成電路的生產和研發提供了有力的支持。
Hendon Semiconductors以其強大的定制化集成電路設計能力而聞名。公司擁有一支經驗豐富的設計團隊,能夠為客戶提供從概念到量產的一站式解決方案。這種定制化服務不僅滿足了客戶對特殊功能和高性能的需求,也幫助Hendon Semiconductors在競爭激烈的市場中脫穎而出。通過不斷積累成功案例和技術經驗,Hendon Semiconductors逐漸在定制化集成電路設計領域建立了良好的口碑。
GHI Electronics深知技術創新是企業持續發展的關鍵。因此,公司不斷加大研發投入,致力于開發具有自主知識產權的產品。其中,ARM微控制器、顯示模塊、空氣質量傳感器、模塊化系統以及微處理器等主打產品系列,憑借其卓越的性能和穩定的品質,在消費電子、便攜設備、通訊/網絡等領域獲得了廣泛應用。這些技術創新不僅鞏固了GHI Electronics在市場上的領先地位,也為其未來的發展奠定了堅實的基礎。
隨著公司業務的不斷發展,Displaytech于1997年在加利福尼亞州圣地亞哥成立了銷售辦事處,名為SEACOMP。這一舉措標志著公司開始向國際市場進軍。SEACOMP的成立不僅為公司帶來了更多的商業機會,也促進了公司在全球范圍內的技術交流與合作。
詳細信息: 書籍作者:天津市半導體器件廠 圖書出版社:內發 圖書類別:理科、工程技術 出版時間:1970-10 印刷時間:1970-10-01 開本:大16開 頁數:135 頁 裝訂:平裝 & ...… 查看全部問答∨ |
本信息來自合作QQ群:電子工程師技術交流(12425841) 群主在壇子ID:Kata 有沒有朋友能詳細解說一下漏電開關的問題 我知道是測試火零之間的電流差,來控制斷路。 我現在的問題是,火零之間的電流差是如何形成的?能否舉例畫個圖給看下?… 查看全部問答∨ |
小弟在WINCE上用directshow做一個視頻播放器。 在播放RMVB文件時非常奇怪,每個文件播放大約 四秒后在換下一曲就沒有問題,如果很快的更換 下一曲時程序就會崩潰掉。 ...… 查看全部問答∨ |
|
這個問題非常基礎但是有幾個地方不是很明白: 在畫原理圖時,大部分需要自己畫芯片,一些主要的芯片,庫里面總是沒有 在畫芯片時,關于芯片引腳習慣上都是定義成什么? 我看芯片引腳有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...… 查看全部問答∨ |