?? 專欄簡(jiǎn)介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。
?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋。
??專欄目標(biāo):實(shí)現(xiàn)從零基礎(chǔ)入門51單片機(jī)和STM32單片機(jī),力求在玩好單片機(jī)的同時(shí),能夠了解一些計(jì)算機(jī)的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內(nèi)容: 主要學(xué)習(xí)STM32單片機(jī)的功能、各個(gè)模塊、單片機(jī)的外設(shè)、驅(qū)動(dòng)等,最終玩好單片機(jī)和單片機(jī)的外設(shè),全程手敲代碼,實(shí)現(xiàn)我們所要實(shí)現(xiàn)的功能。
?? 專欄說明 :如果文章知識(shí)點(diǎn)有錯(cuò)誤的地方,歡迎大家隨時(shí)在文章下面評(píng)論,我會(huì)第一時(shí)間改正。讓我們一起學(xué)習(xí),一起進(jìn)步。
??專欄主頁:http://t.csdn.cn/HCD8v
本學(xué)習(xí)過程參考:https://space.bilibili.com/383400717
STM3單片機(jī)安裝軟件、各種資料以及源碼的路徑:
鏈接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取碼:asdf
鏈接里壓縮包的解壓密碼:32
本大節(jié)主要學(xué)習(xí)USART的相關(guān)知識(shí),包含九小節(jié):
第一小節(jié)主要學(xué)習(xí)USART串口協(xié)議的理論基礎(chǔ)知識(shí)
第二小節(jié)主要學(xué)習(xí)USART串口外設(shè)的理論基礎(chǔ)知識(shí)
第三小節(jié)是對(duì)第一、二小節(jié)的內(nèi)容寫一個(gè)串口發(fā)送程序進(jìn)行練習(xí)
第四小節(jié)是對(duì)第一、二小節(jié)的內(nèi)容再寫一個(gè)串口發(fā)送+接收的程序進(jìn)行練習(xí)
第五小節(jié)主要學(xué)習(xí)USART串口數(shù)據(jù)包的理論基礎(chǔ)知識(shí)
第六小節(jié)是對(duì)第五小節(jié)的內(nèi)容寫一個(gè)串口收發(fā)HEX數(shù)據(jù)包程序進(jìn)行練習(xí)
第七小節(jié)是對(duì)第五小節(jié)的內(nèi)容再寫一個(gè)串口收發(fā)文本數(shù)據(jù)包程序進(jìn)行練習(xí)
第八小節(jié)主要了解FlyMcu串口下載的知識(shí)
第九小節(jié)主要了解STLINK Utility串口下載的知識(shí)
最終附上所有的源代碼;
本小節(jié)主要是對(duì)前面學(xué)習(xí)的串口理論知識(shí)再次進(jìn)行實(shí)戰(zhàn)練習(xí):寫一個(gè)串口發(fā)送+接收的程序進(jìn)行練習(xí)。
一、本節(jié)目標(biāo)
目標(biāo):串口發(fā)送+接收
寫一個(gè)串口模塊,通過串口通信,把一些數(shù)據(jù)發(fā)到電腦上的串口助手來顯示,
該程序的功能是判斷單片機(jī)是否收到數(shù)據(jù),如果收到數(shù)據(jù),則讀取數(shù)據(jù),并將數(shù)據(jù)回傳到電腦同時(shí)在OLED上進(jìn)行顯示;
把STM32的串口引腳,接到電腦上,如下圖所示:
之后電腦端打開串口助手軟件,按如下圖進(jìn)行配置,并打開串口
在發(fā)送區(qū)寫一個(gè)數(shù)據(jù)41,點(diǎn)擊發(fā)送,可以看到OLED上顯示了接受到的數(shù)據(jù)為41,并且串口工具的接收區(qū),也接收到了41這個(gè)數(shù)據(jù);
此時(shí)如果我們把接收模式換成文本模式,再發(fā)送,可以看到,串口助手收到的信息為字符文本A了,這就是數(shù)據(jù)41對(duì)應(yīng)的字符文本A了,如下圖所示:
二、練習(xí)2:串口發(fā)送+接收
2.1 接線圖
- 最下面是USB轉(zhuǎn)串口模塊,跳線帽要插在VCC和3V3這兩個(gè)引腳上(圖中黃色小塊兒),選擇通信的TTL電平為3.3;然后通信引腳TXD和RXD要接在STM3的PA9和PA10口,選擇這兩個(gè)引腳的原因是引腳定義表中USART1的TX是PA9,RX是PA10;然后USB轉(zhuǎn)串口的負(fù)極和STM32的負(fù)極接在一起進(jìn)行共地;
- USB轉(zhuǎn)串口模塊和JLINK都是要插在電腦的USB口;
硬件電路如下所示:
然后打開電腦設(shè)備管理器,確認(rèn)串口端口正常鏈接沒問題:
2.2 源碼
STM32入門教程資料\程序源碼\STM32Project\9-2 串口發(fā)送+接收\(chéng)User
STM32入門教程資料\程序源碼\STM32Project\9-2 串口發(fā)送+接收\(chéng)Hardware
STM32入門教程資料\程序源碼\STM32Project\9-2 串口發(fā)送+接收\(chéng)System
2.2.1 代碼思路
整個(gè)代碼的流程參考以上結(jié)構(gòu)圖:
- 第一步,開啟時(shí)鐘;把需要用到的USART和GPIO的時(shí)鐘打開;
- 第二步,GPIO初始化,把TX配置成復(fù)用輸出,RX配置成復(fù)用輸入;
- 第三步,配置USART,直接使用一個(gè)結(jié)構(gòu)體,就可以把以上框圖中所有參數(shù)配置好;
- 第四步,如果只需要發(fā)送功能,就直接開啟USART,初始化就結(jié)束了;如果需要接收功能,那可能還需要配置中斷;那就在開啟USART之前,再加上ITConfig和NVIC的代碼;
- 初始化完成后,如果要發(fā)送數(shù)據(jù),就調(diào)用發(fā)送函數(shù);如果如果要接收數(shù)據(jù),就調(diào)用就收的函數(shù);如果要獲取發(fā)送和接收的狀態(tài),就調(diào)用獲取標(biāo)志位的函數(shù);
2.2.2 具體代碼及解釋
這里的代碼注釋我僅注釋了相較于上一小節(jié)多出的部分,即接收的部分;
至于關(guān)于發(fā)送部分的注釋,可以參考上一小節(jié)(STM32單片機(jī)(九)USART串口----第三節(jié):USART串口實(shí)戰(zhàn)練習(xí)(串口發(fā)送)),注釋比較完整,代碼也差不多;文章來源:http://www.zghlxwxcb.cn/news/detail-498661.html
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
uint8_t RxData;
int main(void)
{
OLED_Init();
OLED_ShowString(1, 1, "RxData:");
Serial_Init();
while (1)
{
if (Serial_GetRxFlag() == 1)//使用查詢的方式讀取收到的數(shù)據(jù),即該標(biāo)志位置1說明有收到數(shù)據(jù)
{
RxData = Serial_GetRxData();
Serial_SendByte(RxData);
OLED_ShowHexNum(1, 8, RxData, 2);
}
}
}
Serial.c
:文章來源地址http://www.zghlxwxcb.cn/news/detail-498661.html
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
uint8_t Serial_RxData;
uint8_t Serial_RxFlag;
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
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;//設(shè)置Pin_10口,接收口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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;//模式設(shè)置為發(fā)送和接收
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);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
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);
}
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1, Byte);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
void Serial_SendString(char *String)
{
uint8_t i;
for (i = 0; String[i] != '\0'; i ++)
{
Serial_SendByte(String[i]);
}
}
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y --)
{
Result *= X;
}
return Result;
}
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
uint8_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
}
}
int fputc(int ch, FILE *f)
{
Serial_SendByte(ch);
return ch;
}
void Serial_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg);
va_end(arg);
Serial_SendString(String);
}
uint8_t Serial_GetRxFlag(void)
{
if (Serial_RxFlag == 1)
{
Serial_RxFlag = 0;
return 1;
}
return 0;
}
uint8_t Serial_GetRxData(void)
{
return Serial_RxData;
}
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
Serial_RxData = USART_ReceiveData(USART1);
Serial_RxFlag = 1;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
到了這里,關(guān)于STM32單片機(jī)(九)USART串口----第四節(jié):USART串口實(shí)戰(zhàn)練習(xí)(串口發(fā)送+接收)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!