目錄
通信方式
硬件電路
軟件部分
USART外設(shè)(同步/異步收發(fā)器)
波特率
引腳復(fù)用
初始化基本流程
發(fā)送
接收
語(yǔ)言簡(jiǎn)述
常用的函數(shù)
使用的結(jié)構(gòu)體
引腳模式
打印數(shù)據(jù)的三種方法
使用printf
在實(shí)際的串口中,只能發(fā)送二進(jìn)制數(shù),也就是十六進(jìn)制的最直接數(shù)據(jù)。如果想發(fā)送字符,就需要一個(gè)數(shù)據(jù)->字符的映射表(如ASCII表)
通信方式
全雙工:兩根線,數(shù)據(jù)的發(fā)送和接收互不影響。
半雙工:一根線,一發(fā)一收。
單工:數(shù)據(jù)只能從一個(gè)設(shè)備到另一個(gè)設(shè)備。
舉例子->
全雙工:打電話。半雙工:對(duì)講機(jī)。單工:廣播
有時(shí)鐘線,同步通信
無(wú)時(shí)鐘線,異步,甚至需要添加幀頭幀尾使數(shù)據(jù)對(duì)齊。
單端信號(hào)(電平):它們引腳的高低電平都是對(duì)GND的電壓差,所以單端通信的雙方都必須共地,就是把GND接到一起。
而差分信號(hào)則不用。
硬件電路
TX、RX、GND是必須要接的,而VCC若兩個(gè)設(shè)備都有獨(dú)立供電,可以不接。?
使用TTL電平。
軟件部分
?倆種形式
?有校驗(yàn)位就是9位數(shù)據(jù)位,沒(méi)有就是8位。
?數(shù)據(jù)低位先行
預(yù)發(fā)送數(shù)據(jù) 0x0f? ? (H)0000 1111(L)
L->H
檢驗(yàn)位采用奇偶校驗(yàn)的方法(如果數(shù)據(jù)錯(cuò)了可以丟棄或者重傳)
????????校驗(yàn)3法 : 無(wú)校驗(yàn) 奇校驗(yàn) 偶校驗(yàn)
- 無(wú)校驗(yàn) 如1幀10位 沒(méi)有校驗(yàn)位
- 奇校驗(yàn) 包括校驗(yàn)位會(huì)出現(xiàn)奇數(shù)個(gè)1
- 偶校驗(yàn) 包括校驗(yàn)位會(huì)出現(xiàn)偶數(shù)個(gè)1
如 奇校驗(yàn) 0000 1111 總共4個(gè)1,于是校驗(yàn)位就會(huì)補(bǔ)一個(gè)1,保證其是奇數(shù)。
奇偶校驗(yàn)只能保證一定程度上的驗(yàn)出率,更高級(jí)還是得了解CRC校驗(yàn)。
USART外設(shè)(同步/異步收發(fā)器)
【注意】USART1是掛在APB2總線上的,而其他是在APB1總線上的。
STM32F103C8T6 USART資源 :USART1(APB2)、USART2、USART3(APB1)
開(kāi)啟時(shí)鐘的時(shí)候需要控制。
波特率
波特率發(fā)生器就是分頻器,APB時(shí)鐘進(jìn)行分頻,得到發(fā)送和接收移位的時(shí)鐘。
USART1掛載在APB2【中文參考手冊(cè)---系統(tǒng)架構(gòu)】,所以就是PCLK2的時(shí)鐘,一般是72M。其余的是APB1,也就是36M。
然后進(jìn)行分頻。晶振除以一個(gè)USARTDIV的分頻系數(shù),分頻完之后還要再除以16
引腳復(fù)用
? ?
初始化基本流程
參考中文手冊(cè)USART部分
發(fā)送
接收
語(yǔ)言簡(jiǎn)述
- 開(kāi)啟外設(shè),開(kāi)啟時(shí)鐘,把需要用的USART和GPIO的時(shí)鐘打開(kāi)
- GPIO初始化,把TX配置成復(fù)用輸出,RX配置成輸出
- 配置USART,直接使用一個(gè)結(jié)構(gòu)體
- 如果只需要發(fā)送功能,直接開(kāi)啟USART初始化就結(jié)束了。如果還需要接收還需要開(kāi)啟中斷。在開(kāi)啟中斷之前,再加上ITConfig和NVIC的代碼。
常用的函數(shù)
使用的結(jié)構(gòu)體
USART_InitTypeDef、
USART_ClockInitTypeDef【同步時(shí)鐘,但是我們一般使用的是異步通信,所以不怎么用】
引腳模式
????????TX是USART外設(shè)控制輸出腳,所以選擇復(fù)用推挽輸出(GPIO_Mode_AF_PP);
????????RX是USART外設(shè)數(shù)據(jù)輸入腳,所以選擇輸入模式。輸入模式并不分什么普通輸入、復(fù)用輸入,一根線只能有一個(gè)輸出,但可以有多個(gè)輸入。所以輸入腳外設(shè)、GPIO都可以使用。RX一般是浮空輸入or上拉輸入。因?yàn)榇诓ㄐ慰臻e狀態(tài)是高電平,所以不采用下拉輸入。
void USART_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//GPIO配置控制
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //RX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART配置控制
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
//接收使能,接受不為空的時(shí)候產(chǎn)生中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//NVIC配置控制
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
}
ctrl+alt +space 開(kāi)啟聯(lián)想
打印數(shù)據(jù)的三種方法
? ? ? ? 1、printf
? ? ? ? 2、sprintf
? ? ? ? 3、封裝sprintf(進(jìn)階學(xué)習(xí)--->C語(yǔ)言可變參數(shù))
使用printf
?還要進(jìn)行重定向?qū)?stdio.h
printf->單。意思是只有一個(gè)串口可以使用。
sprintf->多??梢灾付ù蛴∥恢?,不涉及重定向的東西。
格式+內(nèi)容。?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-528909.html
?MicroLIB是keil為嵌入式平臺(tái)優(yōu)化的精簡(jiǎn)庫(kù),在keil里面使用printf函數(shù)要使用這個(gè),然后還需要重定向,將怕printf函數(shù)打印的東西輸出到串口。先include ->stdio.h,然后重寫(xiě)fputc(這個(gè)是printf的底層)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-528909.html
到了這里,關(guān)于串口通信-發(fā)送和接收數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!