?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。
?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋。
??專欄目標:實現從零基礎入門51單片機和STM32單片機,力求在玩好單片機的同時,能夠了解一些計算機的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內容: 主要學習STM32單片機的功能、各個模塊、單片機的外設、驅動等,最終玩好單片機和單片機的外設,全程手敲代碼,實現我們所要實現的功能。
?? 專欄說明 :如果文章知識點有錯誤的地方,歡迎大家隨時在文章下面評論,我會第一時間改正。讓我們一起學習,一起進步。
??專欄主頁:http://t.csdn.cn/HCD8v
本學習過程參考:https://space.bilibili.com/383400717
STM3單片機安裝軟件、各種資料以及源碼的路徑:
鏈接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取碼:asdf
鏈接里壓縮包的解壓密碼:32
本大節(jié)主要學習USART的相關知識,包含九小節(jié):
第一小節(jié)主要學習USART串口協議的理論基礎知識
第二小節(jié)主要學習USART串口外設的理論基礎知識
第三小節(jié)是對第一、二小節(jié)的內容寫一個串口發(fā)送程序進行練習
第四小節(jié)是對第一、二小節(jié)的內容再寫一個串口發(fā)送+接收的程序進行練習
第五小節(jié)主要學習USART串口數據包的理論基礎知識
第六小節(jié)是對第五小節(jié)的內容寫一個串口收發(fā)HEX數據包程序進行練習
第七小節(jié)是對第五小節(jié)的內容再寫一個串口收發(fā)文本數據包程序進行練習
第八小節(jié)主要了解FlyMcu串口下載的知識
第九小節(jié)主要了解STLINK Utility串口下載的知識
最終附上所有的源代碼;
本小節(jié)主要是對前面學習的串口理論知識進行實戰(zhàn)練習:寫一個串口發(fā)送的程序進行練習。
一、本節(jié)目標
目標:串口發(fā)送
寫一個串口模塊,通過串口通信,把一些數據發(fā)到電腦上的串口助手來顯示,
把STM32的串口引腳,接到電腦上,如下圖所示:
之后電腦端打開串口助手軟件,按如下圖進行配置,并打開串口
按一下復位鍵,程序剛開始啟動時會向串口發(fā)送一串數據,如下圖所示:
此時切換成文本模式,再次復位,這時,軟件就會對剛才的數據進行文本映射,找到每個數據對應的字符,以字符串的形式顯示出來;如下圖所示:
二、練習1:串口發(fā)送
2.1 接線圖
- 最下面是USB轉串口模塊,跳線帽要插在VCC和3V3這兩個引腳上(圖中黃色小塊兒),選擇通信的TTL電平為3.3;然后通信引腳TXD和RXD要接在STM3的PA9和PA10口,選擇這兩個引腳的原因是引腳定義表中USART1的TX是PA9,RX是PA10;然后USB轉串口的負極和STM32的負極接在一起進行共地;
- USB轉串口模塊和JLINK都是要插在電腦的USB口;
硬件電路如下所示:
然后打開電腦設備管理器,確認串口端口正常鏈接沒問題:
2.2 源碼
STM32入門教程資料\程序源碼\STM32Project\9-1 串口發(fā)送\User
STM32入門教程資料\程序源碼\STM32Project\9-1 串口發(fā)送\Hardware
STM32入門教程資料\程序源碼\STM32Project\9-1 串口發(fā)送運\System
2.2.1 代碼思路
整個代碼的流程參考以上結構圖:文章來源:http://www.zghlxwxcb.cn/news/detail-497795.html
- 第一步,開啟時鐘;把需要用到的USART和GPIO的時鐘打開;
- 第二步,GPIO初始化,把TX配置成復用輸出,RX配置成復用輸入;
- 第三步,配置USART,直接使用一個結構體,就可以把以上框圖中所有參數配置好;
- 第四步,如果只需要發(fā)送功能,就直接開啟USART,初始化就結束了;如果需要接收功能,那可能還需要配置中斷;那就在開啟USART之前,再加上ITConfig和NVIC的代碼;
- 初始化完成后,如果要發(fā)送數據,就調用發(fā)送函數;如果如果要接收數據,就調用就收的函數;如果要獲取發(fā)送和接收的狀態(tài),就調用獲取標志位的函數;
2.2.2 具體代碼及解釋
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
int main(void)
{
OLED_Init();
Serial_Init();
Serial_SendByte(0x41);
uint8_t MyArray[] = {0x42, 0x43, 0x44, 0x45};
Serial_SendArray(MyArray, 4);
Serial_SendString("\r\nNum1=");
Serial_SendNumber(111, 3);
printf("\r\nNum2=%d", 222);
char String[100];
sprintf(String, "\r\nNum3=%d", 333);
Serial_SendString(String);
Serial_Printf("\r\nNum4=%d", 444);
Serial_Printf("\r\n");
while (1)
{
}
}
Serial.c
:文章來源地址http://www.zghlxwxcb.cn/news/detail-497795.html
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//開啟USART1的時鐘;USART1是APB2的外設
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//開啟GPIO時鐘
/*初始化引腳,把PA9配置為復用推挽輸出,供USART1的TX使用*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引腳模式選擇復用推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//因為本節(jié)只需要發(fā)送,所以只初始化Pin_9即可
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO引腳;
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;//波特率設置為9600
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制,不開啟
USART_InitStructure.USART_Mode = USART_Mode_Tx;//模式選擇為發(fā)送模式
USART_InitStructure.USART_Parity = USART_Parity_No;//檢驗位選擇無校驗
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位選擇1
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長選擇8位
USART_Init(USART1, &USART_InitStructure);//初始化USART1
USART_Cmd(USART1, ENABLE);
}
/*發(fā)送字節(jié)函數*/
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1, Byte);//發(fā)送數據,就是寫DR寄存器
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待TXE置1;不需要手動清零,下一次發(fā)送數據時該標志位會自動清零
}
/*發(fā)送數組函數*/
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
/*發(fā)送字符串函數*/
void Serial_SendString(char *String)
{
uint8_t i;
for (i = 0; String[i] != '\0'; i ++)
{
Serial_SendByte(String[i]);
}
}
/*計算x的y次方*/
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y --)
{
Result *= X;
}
return Result;
}
/*發(fā)送數字函數*/
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');
}
}
/*
重寫fputc函數
將fputc函數重定向到串口
重寫他的原因是后面我們用printf函數,printf函數底層是不斷調用fputc函數的
*/
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);//從format位置開始接收參數表
vsprintf(String, format, arg);
va_end(arg);//釋放參數表
Serial_SendString(String);
}
到了這里,關于STM32單片機(九)USART串口----第三節(jié):USART串口實戰(zhàn)練習(串口發(fā)送)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!