新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM學(xué)習(xí)《六》——從頭文件開始自己動(dòng)手設(shè)置STM32串口通訊

        ARM學(xué)習(xí)《六》——從頭文件開始自己動(dòng)手設(shè)置STM32串口通訊

        作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
        運(yùn)用STM32的庫(kù)函數(shù)時(shí),有時(shí)候?yàn)榱丝炊痪湔Z句需要翻遍整個(gè)頭文件,找到頭文件中預(yù)定義的名字到底代表的是什么意思,具體寄存器設(shè)置的數(shù)值是多少,相當(dāng)麻煩。我花了一天的時(shí)間才明白串口設(shè)置的具體過程,只是庫(kù)函數(shù)想的比較周全。下面是我調(diào)試好的串口設(shè)置程序,頭文件是我自己定義的,舍去了庫(kù)文件中繁瑣的結(jié)構(gòu)體定義……

        首先定義頭文件:

        本文引用地址:http://www.104case.com/article/201611/318955.htm

        /

        RCC_CFGR &= (uint32_t)0xF8FF0000;

        RCC_CR &= (uint32_t)0xFEF6FFFF;//

        RCC_CR &= (uint32_t)0xFFFBFFFF;//

        RCC_CFGR &= (uint32_t)0xFF80FFFF;//

        RCC_CIR = 0x00000000;/

        RCC_CR |=0x00010000;//

        do

        {

        HSEStatus = RCC_CR & 0x00020000;

        StartUpCounter++;

        } while((HSEStatus == 0) && (StartUpCounter != 0x0500));

        if ((RCC_CR & 0x00020000) != 0)

        {

        HSEStatus =0x01;

        }

        else

        {

        HSEStatus =0x00;

        }

        if (HSEStatus ==0x01)

        {

        RCC_CFGR |=0x00000000;//

        RCC_CFGR |=0x00000000;//

        RCC_CFGR |=0x00000000;//

        RCC_CFGR &=(~(0x00010000 | 0x00020000 | 0x003C0000));

        RCC_CFGR |= 0x00010000 | 0x00020000 | 0x000C0000;//

        RCC_CR |= 0x01000000;//

        while((RCC_CR & 0x02000000) == 0)//

        {

        }

        RCC_CFGR &=~0x00000003;

        RCC_CFGR |=0x00000002; //

        while ((RCC_CFGR &0x0000000C) !=0x08) //

        {

        }

        }

        else

        {while (1)

        {

        }

        }

        }

        設(shè)置好時(shí)鐘就可以串口初始化了:

        void stm32_UsartSetup ()//串口初始化

        {

        RCC_APB2ENR|=0x00004000;// enable clock for USART1

        RCC_APB2ENR|=0x00000001;//復(fù)用功能IO時(shí)鐘使能

        RCC_APB2ENR|=0x00000004;//端口A時(shí)鐘使能

        GPIO_PORTA_CRH&=~(0x00000FF0);// Clear PA9, PA10

        GPIO_PORTA_CRH|=0x000000B0;// USART1 Tx (PA9)alternate output push-pull

        GPIO_PORTA_CRH|=0x00000400;// USART1 Rx (PA10) input floating

        USART1_BRR=0x00000823;////波特率9600/20M

        USART1_CR1&=0xFFFFEFFF;// set Data bits

        USART1_CR2&=0xFFFFCFFF;// set Stop bits

        USART1_CR1&=0xFFFFFBFF;//// set Parity

        USART1_CR1|=(0x00000004|0x00000008);// RX, TX enable

        USART1_CR1|=0x00002000;// USART enable

        }

        到此串口設(shè)置設(shè)置完畢,下面我要和PC機(jī)通訊了,我要從上位機(jī)通過串口助手發(fā)送一字節(jié)的十六進(jìn)制數(shù),然后下位機(jī)(STM32)返回給PC機(jī)所發(fā)的一字節(jié)數(shù)據(jù):

        int main()

        {

        SystemInit0();

        stm32_UsartSetup ();

        while(1)

        {

        while(USART1->SR&0x00000020)//等待RXNE置位

        {

        flag=USART1_DR&0xff;

        USART1_DR=flag&0xff;

        while((USART1->SR)&0x80==0);//等待發(fā)送完畢

        while((USART1->SR)&0x40==0);

        flag=USART1->SR;

        }

        }

        }




        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 瑞丽市| 黑水县| 长白| 岱山县| 岳阳县| 德昌县| 花垣县| 新龙县| 鹤岗市| 灵石县| 富蕴县| 霸州市| 美姑县| 井冈山市| 万载县| 彰武县| 苗栗县| 四会市| 南漳县| 鄂尔多斯市| 攀枝花市| 内丘县| 息烽县| 大石桥市| 甘谷县| 中方县| 洮南市| 宁南县| 闻喜县| 当涂县| 习水县| 财经| 博爱县| 巩留县| 宜丰县| 渑池县| 惠来县| 大冶市| 广水市| 宁陵县| 广昌县|