娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月07日(星期五)

正在發生

2020年02月07日 | STM8S使用外部時鐘引起串口數據傳輸錯誤

發布者:數字夢想 來源: eefocus關鍵字:STM8S  外部時鐘  串口數據  傳輸錯誤 手機看文章 掃描二維碼
隨時隨地手機看文章

最近有個小東西用到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  外部時鐘  串口數據  傳輸錯誤 引用地址:STM8S使用外部時鐘引起串口數據傳輸錯誤

上一篇:STM8S的按鍵PWM調光燈歷程
下一篇:使用STM8S003K3 ADC簡介以及初始化

推薦閱讀

01超級周期并未出現過去一年,不斷有分析師吶喊iPhone X將把蘋果帶入到一個“超級周期”,重回甚至超越iPhone 6推出時的盛況。但蘋果公布的業績數據顯示,情況并不是那么回事。蘋果(NASDAQ:AAPL)上周四公布,2018財年第一財季的iPhone銷量為7,730萬部,低于分析師8,000萬部的平均預期,也低于上年同期的7,830萬部。蘋果第一財季收入為883億美元,凈利潤...
MRAM開發商Spin Transfer Technologies Inc.已更名為Spin Memory Inc.(加利福尼亞州弗里蒙特),并在Applied Ventures LLC和ARM Ltd.領導的B輪融資中募集了5200萬美元。 Applied Ventures LLC是芯片制造設備供應商Applied Materials Inc的風險投資部門。Spin Transfer Technologies成立于2007年,由孵化器公司Allied Minds全資擁有。 Glob...
#include<reg52.h>#include <intrins.h>#define uchar unsigned charuchar code dis1[] = {" 2262 CODE IS "};void delay_1s(uchar);typedef unsigned char BYTE;typedef unsigned int WORD;typedef bit BOOL ;sbit rs = P2^6 ;sbit rw = P3^6 ;sbit ep = P2^7 ;delay(BYTE ms){ // 延時子程序BYTE i;whi...
TekExpress千兆汽車以太網一致性測試解決方案,是滿足復雜汽車設計要求的首個解決方案。隨著自動駕駛,5G和互聯汽車解決方案等新的汽車技術的發展,必須測試承載支持這些技術所需的數據路徑,以確保車輛電子子系統之間的可靠傳輸。作為自動化的合規性測試應用程序,泰克TekExpress千兆位汽車以太網合規性測試解決方案可對多千兆位以太網芯片組和電子控制單...

史海拾趣

問答坊 | AI 解惑

貼片封裝及其別稱!

1、BGA(ball grid array) 球形觸點陳列,表面貼裝型封裝之一。在印刷基板的背面按陳列方式制作出球形凸點用 以 代替引腳,在印刷基板的正面裝配LSI 芯片,然后用模壓樹脂或灌封方法進行密封。也 稱為凸 點陳列載體(PAC)。引腳可超過200,是多引腳 ...…

查看全部問答∨

DC-DC轉換

最近用max1846按電源設計手冊做了一個   5V轉-5V的電路   但不知怎么調整!…

查看全部問答∨

【藏書閣】晶體管偏流表(油印內發)

詳細信息: 書籍作者:天津市半導體器件廠   圖書出版社:內發 圖書類別:理科、工程技術    出版時間:1970-10 印刷時間:1970-10-01 開本:大16開    頁數:135 頁     裝訂:平裝  & ...…

查看全部問答∨

有沒有朋友能詳細解說一下漏電開關的問題

本信息來自合作QQ群:電子工程師技術交流(12425841) 群主在壇子ID:Kata 有沒有朋友能詳細解說一下漏電開關的問題 我知道是測試火零之間的電流差,來控制斷路。 我現在的問題是,火零之間的電流差是如何形成的?能否舉例畫個圖給看下?…

查看全部問答∨

[FPGA]推薦一下比較好的入門資料

工作需要,小弟需要了解一下FPGA在芯片設計和開發中的作用,不需要非常深入的資料,各位大哥大姐又沒有比較好的資料? 先行謝過…

查看全部問答∨

wince renderfile rmvb問題

    小弟在WINCE上用directshow做一個視頻播放器。     在播放RMVB文件時非常奇怪,每個文件播放大約     四秒后在換下一曲就沒有問題,如果很快的更換     下一曲時程序就會崩潰掉。     ...…

查看全部問答∨

vxworks 如何動態加載.0文件?

驅動文件以.0給出,需要檢測到有該硬件再加載其驅動,如何實現?有什么命令可以?謝謝…

查看全部問答∨

cadence問題求助------5!

這個問題非常基礎但是有幾個地方不是很明白: 在畫原理圖時,大部分需要自己畫芯片,一些主要的芯片,庫里面總是沒有 在畫芯片時,關于芯片引腳習慣上都是定義成什么? 我看芯片引腳有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 大荔县| 磐石市| 泽库县| 江陵县| 开远市| 龙江县| 建瓯市| 邮箱| 缙云县| 丰顺县| 镇雄县| 太保市| 镇江市| 蒙城县| 临湘市| 天峻县| 澎湖县| 左贡县| 邢台市| 靖州| 巴马| 城固县| 越西县| 丹棱县| 兴义市| 内江市| 从化市| 博爱县| 南安市| 望奎县| 清苑县| 博乐市| 南溪县| 怀远县| 北票市| 木里| 滨州市| 宣恩县| 彩票| 中西区| 会昌县|