新聞中心

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

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

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

首先定義頭文件:

本文引用地址:http://butianyuan.cn/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è)置好時鐘就可以串口初始化了:

void stm32_UsartSetup ()//串口初始化

{

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

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

RCC_APB2ENR|=0x00000004;//端口A時鐘使能

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機通訊了,我要從上位機通過串口助手發(fā)送一字節(jié)的十六進制數(shù),然后下位機(STM32)返回給PC機所發(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;

}

}

}




評論


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

關(guān)閉