前言
開發(fā)板:stm32f407VET6
開發(fā)環(huán)境:keil5 MDK
串口通信的相關知識,請參考這篇文章 【STM32】5分鐘了解STM32的串口通信
這篇文章講的都是基礎知識,那么串口通信的代碼該如何寫呢?
一、串口通信基本知識
【STM32】5分鐘了解STM32的串口通信
二、編程思路
usart.h
// =============================================
# @Time : 2020-09-03
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @FileName: usart.h
# @Software: keil5 MDK
// =============================================
#ifndef __USART_H
#define __USART_H
#include "stm32f4xx_conf.h"
#include "sys.h"
#define EN_USART1_RX 0 //使能(1)/禁止(0)串口1接收
void uart_init(u32 bound);
void Usart_Sendbyte(USART_TypeDef * USARTx , uint8_t data);
void Usart_SendString(USART_TypeDef * USARTx , char * string);
usart.c
// =============================================
# @Time : 2020-09-03
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @FileName: usart.c
# @Software: keil5 MDK
// =============================================
#include "sys.h"
#include "usart.h"
//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘
//串口1對應引腳復用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9復用為USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10復用為USART1
//USART1端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9與GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
//USART1 初始化設置
USART_InitStructure.USART_BaudRate = bound;//波特率設置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
#if EN_USART1_RX
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟相關中斷
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器、
#endif
}
/***************** 發(fā)送一個字符 **********************/
void Usart_Sendbyte(USART_TypeDef * USARTx , uint8_t data)
{
USART_SendData(USARTx,data);
while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));
}
/***************** 發(fā)送字符串 **********************/
void Usart_SendString(USART_TypeDef * USARTx , char * string)
{
char *str = string;
while(*str)
{
Usart_Sendbyte(USARTx , *str);
str++;
}
}
main.c
// =============================================
# @Time : 2020-09-03
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @FileName: main.c
# @Software: keil5 MDK
// =============================================
#include "stm32f4xx.h"
#include "usart.h"
void delay(uint32_t count)
{
for( ;count!=0;count--);
}
int main()
{
uart_init(115200);
while(1)
{
Usart_SendString( USART1 , "Hello World");
delay(0xffffff);
}
}
宏定義
另外為了便于調試,也可以加上 宏定義
// =============================================
# @Time : 2020-09-03
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @Software: keil5 MDK
// =============================================
//引腳宏定義
/*******************************************************/
#define DEBUG_USART USART1
/* 不同的串口掛載的總線不一樣,時鐘使能函數也不一樣,移植時要注意
* 串口 1 和 6 是 RCC_APB2PeriphClockCmd
* 串口 2/3/4/5 是 RCC_APB1PeriphClockCmd
*/
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_BAUDRATE 115200
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_RX_PIN GPIO_Pin_10
#define DEBUG_USART_RX_AF GPIO_AF_USART1
#define DEBUG_USART_RX_SOURCE GPIO_PinSource10
#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_TX_PIN GPIO_Pin_9
#define DEBUG_USART_TX_AF GPIO_AF_USART1
#define DEBUG_USART_TX_SOURCE GPIO_PinSource9
#define DEBUG_USART_IRQHandler USART1_IRQHandler
#define DEBUG_USART_IRQ USART1_IRQn
/************************************************************/
三、總結
利用串口助手,可以發(fā)現,上述代碼運行后,串口助手每隔一段時間會收到 Hello World
有可能你的串口助手會出現 亂碼 的現象,先把串口助手的波特率調成程序中設定的波特率(上述程序設定的是115200),如果還是出現亂碼,具體解決方法請參考這篇文章 【STM32】串口通信出現亂碼(使用官方標準庫)
如果串口助手沒有收到 Hello World ,請檢查連接 TX 、RX 端子的杜邦線是否松動。
【參考文獻】
[1] 《零死角玩轉 STM32—基于野火 F407[霸天虎]開發(fā)板 》
上一篇:【STM32】串口通信出現亂碼(使用官方標準庫)
下一篇:【STM32】CubeMX+HAL 輸出PWM
推薦閱讀
史海拾趣
DRI Relays Inc公司成立于XX年代,當時電子繼電器市場正處于快速發(fā)展階段。公司創(chuàng)始人XXX憑借對市場趨勢的敏銳洞察,決定投身于這一領域。然而,創(chuàng)業(yè)之初,公司面臨資金短缺、技術瓶頸和市場競爭激烈等多重挑戰(zhàn)。為了突破困境,XXX帶領團隊日夜兼程地研發(fā)新產品,不斷改進技術,同時積極尋找投資者。在一次行業(yè)展會上,公司的新產品因其獨特的設計和高性能吸引了眾多客戶的關注,為公司贏得了寶貴的訂單和資金支持。
在追求商業(yè)成功的同時,First Switchtech公司(或類似公司)也始終關注可持續(xù)發(fā)展和社會責任。公司致力于環(huán)保產品的研發(fā)和生產,推出了多款符合國際環(huán)保標準的電子開關產品。同時,公司還積極參與公益事業(yè),通過捐贈資金、技術支持等方式幫助貧困地區(qū)改善教育條件、提升醫(yī)療水平等。這些舉措不僅提升了公司的社會形象,也促進了公司與社會的和諧共生。
需要注意的是,以上故事是基于電子行業(yè)普遍趨勢和可能發(fā)展路徑的構想,并非直接針對First Switchtech公司的具體事實。如需了解該公司的真實發(fā)展情況,建議直接訪問其官方網站或查閱相關新聞報道。
在電子行業(yè)的初期,First Switchtech公司(或類似公司)憑借其在開關技術領域的突破性創(chuàng)新,迅速在市場中嶄露頭角。公司研發(fā)出了一種新型低功耗、高可靠性的電子開關,這一創(chuàng)新不僅解決了當時市場上開關設備能耗高、故障率大的問題,還極大地提升了產品的整體性能。隨著這一技術的廣泛應用,First Switchtech公司逐漸在電子開關領域建立了領先地位,并帶動了整個行業(yè)的技術進步。
在電子行業(yè)的初期,First Switchtech公司(或類似公司)憑借其在開關技術領域的突破性創(chuàng)新,迅速在市場中嶄露頭角。公司研發(fā)出了一種新型低功耗、高可靠性的電子開關,這一創(chuàng)新不僅解決了當時市場上開關設備能耗高、故障率大的問題,還極大地提升了產品的整體性能。隨著這一技術的廣泛應用,First Switchtech公司逐漸在電子開關領域建立了領先地位,并帶動了整個行業(yè)的技術進步。
在快速發(fā)展的過程中,ACI始終注重品質管理。公司建立了嚴格的質量檢測體系,確保每一件產品都符合高標準的質量要求。同時,ACI還積極推行持續(xù)改進的理念,不斷優(yōu)化生產流程,提高生產效率。
這些努力使得ACI的產品在市場上贏得了良好的口碑。客戶對公司的產品和服務給予了高度評價,紛紛表示愿意與ACI建立長期合作關系。這些正面的反饋進一步推動了ACI的發(fā)展。
雅特力在追求經濟效益的同時,也高度重視企業(yè)社會責任和可持續(xù)發(fā)展。公司積極參與社會公益事業(yè),通過捐款、捐物等方式支持教育、環(huán)保等領域的發(fā)展。此外,雅特力還注重環(huán)境保護和資源利用,采用環(huán)保材料和節(jié)能技術,努力降低生產過程中的能耗和排放。這些舉措不僅有助于提升公司的社會形象,也為實現可持續(xù)發(fā)展做出了積極貢獻。
本帖最后由 paulhyde 于 2014-9-15 03:38 編輯 我想用反射式紅外對管設計一個檢測電路,可從沒用過紅外對管,哪位有這方面的電路啊,能告訴我下么?謝謝了 [ 本帖最后由 open82977352 于 2010-2-10 16:44 編輯 ] … 查看全部問答∨ |
|
一、測速設備綜述: 交警執(zhí)法用的測速設備包括流動式的雷達測速儀和固定安裝在道路上的機動車超速自動監(jiān)測系統(tǒng)。本文所稱測速設備,主要指固定安裝于道路上的機動車超速自動監(jiān)測系統(tǒng)。 (一)流動式雷達測速儀: &n ...… 查看全部問答∨ |
LM3S8962 DATASHEET 介紹多種可以使用LM3S8962系統(tǒng)時鐘源。LM3S8962的時鐘來源如下: 1. 片上時鐘源,12M+-30%, 作為主時鐘需要上電完成后軟件設置; 2. 主時鐘(可以使用晶振或晶體)(對于OSC0,OSC1)。使用內部PLL,主時鐘允許范圍3 ...… 查看全部問答∨ |
我在用VS2005的時候,有時候做著做著就發(fā)現在右上區(qū)域的哪個函數的下拉列表中的一些函數變灰了,本來好好的應該都是黑色的,點它一下就可以跳到相應的函數里去.但現在變灰了,點了就跳不去了,跑道*.h文件的函數定義那里去了,自己跑到哪個函數的里面 ...… 查看全部問答∨ |
提供紅外遙控轉發(fā)器。 絕非市面上用簡單邏輯制作的轉發(fā)器。 性能非常穩(wěn)定,遙控距離可達7米以上 安全簡單 http://www.flymcu.com http://shop34549393.taobao.com/ QQ:47414986 EMAIL:czzhouyun@hotmail.com 手機:15951211943 … 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 高性能手機設計如何實現?手機高校評估研討會為您揭曉答案!
- TI E2E中文社區(qū)年終回饋,15 塊 CC3200-LAUNCHXL 開發(fā)板免費申請中……測評贏好禮嘍!
- 有獎直播|TI 使用 DLP® 微型投影技術設計增強現實智能眼鏡
- 智慧六月 潛伏在EEWORLD里的一休哥
- 已結束|Maxim IO-Link通信協(xié)議設計方案詳解,5大優(yōu)勢助你輕松聯(lián)網!
- PI 電源小課堂|無 DC-DC 變換實現多路高精度輸出反激電源
- 【摸黑搶樓】贏大禮,關于示波器的狂想曲!正式開搶!!!
- 兆易GD32450I-EVAL免費測評試用
- NI白皮書下載《如何克服復雜待測設備的生產測試挑戰(zhàn)》