国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32學(xué)習(xí)筆記3 正點(diǎn)原子miniSTM32串口通信實(shí)驗(yàn)

這篇具有很好參考價(jià)值的文章主要介紹了STM32學(xué)習(xí)筆記3 正點(diǎn)原子miniSTM32串口通信實(shí)驗(yàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

初學(xué)者學(xué)習(xí)總結(jié),如有錯(cuò)誤,請(qǐng)大神指正


目的:用 STM32 的串口來發(fā)送和接收數(shù)據(jù)。

一、STM32串口

1.1 簡(jiǎn)介

ALIENTEK MiniSTM32 V3 版開發(fā)板選擇的是 STM32F103RCT6 作為 MCU,擁有5 個(gè)串口分別為

USART1、USART2、USART3、UART4、UART5,

其中只有USART1掛載在APB2總線上,其余均掛載在APB1總線上

APB1操作速度限于36MHz,APB2操 作于全速(最高72MHz)。

注:

UART? ? ?通用異步收發(fā)器

USART? ?通用同步異步收發(fā)器

1.2 端口復(fù)用

在STM32F103RCT6中串口 1 的引腳對(duì)應(yīng)的 IO 為 PA9,PA10而PA9,PA10 默認(rèn)功能是 GPIO,所以當(dāng) PA9,PA10 引腳作為串口 1 的 TX,RX 引腳使用的時(shí)候,那就是端口復(fù)用。

復(fù)用端口初始化有幾個(gè)步驟:

1) GPIO 端口時(shí)鐘使能。要使用到端口復(fù)用,當(dāng)然要使能端口的時(shí)鐘了。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2) 復(fù)用的外設(shè)時(shí)鐘使能。比如你要將端口 PA9,PA10 復(fù)用為串口,所以要使能串口時(shí)鐘。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3) 端口模式配置。在 IO 復(fù)用位內(nèi)置外設(shè)功能引腳的時(shí)候,必須設(shè)置 GPIO 端口的模式。下表為對(duì)應(yīng)模式

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

?例如要配置全雙工的串口 1??

代碼如下

//USART1_TX PA.9 復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10 浮空輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA,GPIO_InitStructure);

1.3 USART庫(kù)函數(shù)

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

1.4 串口設(shè)置?

串口設(shè)置的一般步驟可以總結(jié)為如下幾個(gè)步驟:

1) 串口時(shí)鐘使能,GPIO 時(shí)鐘使能

2) 串口復(fù)位 3) GPIO 端口模式設(shè)置

4) 串口參數(shù)初始化

5) 開啟中斷并且初始化 NVIC(如果需要開啟中斷才需要這個(gè)步驟)

6) 使能串口

7) 編寫中斷處理函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-759640.html

1.5 主要函數(shù)介紹

1)串口時(shí)鐘使能

串口是掛載在 APB2 下面的外設(shè),所以使能函數(shù)為:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

2)串口復(fù)位

?alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

USART_DeInit(USART1); //復(fù)位串口 1?

3)串口參數(shù)初始化

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

?一般的實(shí)現(xiàn)格式為:

USART_InitStructure.USART_BaudRate = bound; //波特率; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)?8 位數(shù)據(jù)格式

USART_InitStructure.USART_StopBits = USART_StopBits_1; //一個(gè)停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn)位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件數(shù)據(jù)流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式 USART_Init(USART1, &USART_InitStructure); //初始化串口

4)數(shù)據(jù)發(fā)送與接收

STM32 的發(fā)送與接收是通過數(shù)據(jù)雙寄存器 USART_DR 來實(shí)現(xiàn)的,包含了 TDR 和 RDR。

當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到收據(jù)的時(shí)候,存在該寄存器內(nèi)。

  • 發(fā)送數(shù)據(jù)

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

例如

USART_SendData(USART3, 0x26);

  • 接收數(shù)據(jù)

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)例如

USART_ReceiveData(USART3, 0x26);?

?5)串口狀態(tài)

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

6)串口使能

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

?例如

USART_Cmd(USART1, ENABLE);

7)開啟串口響應(yīng)中斷

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

?alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

例如

?USART_ITConfig(USART1, USART_IT_Transmit ENABLE);

8)獲取相應(yīng)中斷狀態(tài)

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

例如

?ITStatus ErrorITStatus;

ErrorITStatus = USART_GetITStatus(USART1, USART_IT_OverrunError);

二、硬件連接

在ALIENTEK MiniSTM32 V3 版開發(fā)板上串口 1 與 USB 串口并沒有在 PCB 上連接在一起,需要用跳線帽連接。

如圖

alientek ministm32,stm32,單片機(jī),學(xué)習(xí)

?三、程序設(shè)計(jì)

3.1 串口初始化程序

void uart_init(u32 bound){
    //GPIO端口設(shè)置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
    //使能USART1,GPIOA時(shí)鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  
	//USART1_TX即GPIOA9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復(fù)用推挽輸出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9
   
    //USART1_RX即GPIOA10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級(jí)3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級(jí)3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器
  
    //USART 初始化設(shè)置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗(yàn)位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬    
    件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
    USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

代碼編寫對(duì)應(yīng)步驟:

1) 串口時(shí)鐘使能,GPIO 時(shí)鐘使能

2) 串口復(fù)位

3) GPIO 端口模式設(shè)置

4) 串口參數(shù)初始化

5) 開啟中斷并且初始化 NVIC

6) 使能串口

3.2 中斷接收程序

void USART1_IRQHandler(void)                	//串口1中斷服務(wù)程序
	{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
		{
		Res =USART_ReceiveData(USART1);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯(cuò)誤,重新開始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //還沒收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                    //接收數(shù)據(jù)錯(cuò)誤,重新開始接收	  
					}		 
				}
			}   		 
     } 

即第七步

7) 編寫中斷處理函數(shù)

3.3 main

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
int main(void)
{
	u8 t;
	u8 len;
	u16 times=0; 
	
	delay_init(); //延時(shí)函數(shù)初始化
	uart_init(9600); //串口初始化為 9600
	LED_Init(); //初始化與 LED 連接的硬件接口
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置中斷分組 
	
	while(1)
	{
		if(USART_RX_STA&0x8000)
		{ 
			len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長(zhǎng)度
			
			printf("\r\n 您發(fā)送的消息為:\r\n");
			
			for(t=0;t<len;t++)
			{
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束
			}
			
			printf("\r\n\r\n");//插入換行
			
			USART_RX_STA=0;
		}else
		{
			times++;
			
			if(times%5000==0)
			{
				printf("\r\nALIENTEK MiniSTM32 開發(fā)板 串口實(shí)驗(yàn)\r\n");
				printf("正點(diǎn)原子@ALIENTEK\r\n\r\n\r\n");
			}
			
			if(times%200==0)printf("請(qǐng)輸入數(shù)據(jù),以回車鍵結(jié)束\r\n"); 
			if(times%30==0)LED0=!LED0;//閃爍 LED,提示系統(tǒng)正在運(yùn)行.
			
			delay_ms(10); 
		}
	}
}

到了這里,關(guān)于STM32學(xué)習(xí)筆記3 正點(diǎn)原子miniSTM32串口通信實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 正點(diǎn)原子--STM32基本定時(shí)器學(xué)習(xí)筆記(1)

    正點(diǎn)原子--STM32基本定時(shí)器學(xué)習(xí)筆記(1)

    目錄 1. 定時(shí)器概述 1.1 軟件定時(shí)原理 1.2 定時(shí)器定時(shí)原理 1.3 定時(shí)器分類 1.4 定時(shí)器特性表 1.5 基本、通用、高級(jí)定時(shí)器的功能整體區(qū)別 2. 基本定時(shí)器簡(jiǎn)介 3. 基本定時(shí)器框圖 時(shí)鐘樹分析 這部分是筆者對(duì)基本定時(shí)器的理論知識(shí)進(jìn)行學(xué)習(xí)與總結(jié)!主要記錄學(xué)習(xí)過程中遇到的重難點(diǎn)

    2024年02月19日
    瀏覽(22)
  • 【正點(diǎn)原子】STM32電機(jī)應(yīng)用控制學(xué)習(xí)筆記——8.FOC簡(jiǎn)介

    【正點(diǎn)原子】STM32電機(jī)應(yīng)用控制學(xué)習(xí)筆記——8.FOC簡(jiǎn)介

    FOC是適用于無刷電機(jī)的,而像有刷電機(jī),舵機(jī),步進(jìn)電機(jī)是不適用FOC的。FOC是電機(jī)應(yīng)用控制難度最大的部分了。 FOC(Filed Oriented Control)即磁場(chǎng)定向控制,又稱磁場(chǎng)矢量控制(VC,Vector Control),也就是控制磁場(chǎng)的方向以及大小。 無刷電機(jī)的無感控制是六步換向,設(shè)定初始電流

    2024年01月22日
    瀏覽(106)
  • 【【STM32-29正點(diǎn)原子版本串口發(fā)送傳輸實(shí)驗(yàn)】

    【【STM32-29正點(diǎn)原子版本串口發(fā)送傳輸實(shí)驗(yàn)】

    通過串口接收或發(fā)送一個(gè)字符 例程目的 開發(fā)板上我們接入的是實(shí)現(xiàn)異步通信的UART接口 USB轉(zhuǎn)串口原理圖 我們一步步分析 PA9是串口1 的發(fā)送引腳 PA10是串口1 的接受引腳 。因?yàn)槲覀儸F(xiàn)在只是用到異步收發(fā)器功能,所以我們現(xiàn)在只需要 stm32fxx_hal_uart.c 文件(及其頭文件)的驅(qū)動(dòng)代

    2024年02月09日
    瀏覽(20)
  • stm32F407學(xué)習(xí)DAY.14 在DMA模式下進(jìn)行USART串口數(shù)據(jù)收發(fā)(正點(diǎn)原子例程為例)

    stm32F407學(xué)習(xí)DAY.14 在DMA模式下進(jìn)行USART串口數(shù)據(jù)收發(fā)(正點(diǎn)原子例程為例)

    目錄 一、DMA配置 1、DMA1和DMA2的請(qǐng)求映射 2、DMA掛載總線 3、DMA相關(guān)庫(kù)函數(shù) ?4、DMA配置過程(以串口1為例) 1)進(jìn)行時(shí)鐘使能 2)等待DMA可配置 3)初始化DMA(串口1的TX為DMA2 數(shù)據(jù)流7 通道4,RX為DMA2 數(shù)據(jù)流5?通道4) a.DMA外設(shè)地址par: b.DMA存儲(chǔ)器0地址mar: c.數(shù)據(jù)傳輸量ndtr: 4)

    2024年02月04日
    瀏覽(22)
  • 【正點(diǎn)原子】STM32電機(jī)應(yīng)用控制學(xué)習(xí)筆記——2.直流無刷電機(jī)基礎(chǔ)知識(shí)

    【正點(diǎn)原子】STM32電機(jī)應(yīng)用控制學(xué)習(xí)筆記——2.直流無刷電機(jī)基礎(chǔ)知識(shí)

    沒有電刷,無換向器的電機(jī),也稱為無換向器電機(jī)。 主要是定子和轉(zhuǎn)子,而直流有刷電機(jī)多的是換向器和電刷。 而直流有刷的定子是N和S的永磁體,而無刷是三個(gè)線圈饒阻。 直流有刷是定子是饒阻,無刷的定子是N和S的永磁體。兩者的轉(zhuǎn)子和定子恰好是相反的。也是他們最大

    2024年02月03日
    瀏覽(44)
  • 基于STM32的正點(diǎn)原子LORA模塊通信網(wǎng)絡(luò)

    基于STM32的正點(diǎn)原子LORA模塊通信網(wǎng)絡(luò)

    LoRa是semtech公司開發(fā)的一種低功耗局域網(wǎng)無線標(biāo)準(zhǔn),其名稱“LoRa”是遠(yuǎn)距離無線電(Long Range Radio),它最大特點(diǎn)就是在同樣的功耗條件下比其他無線方式傳播的距離更遠(yuǎn),實(shí)現(xiàn)了低功耗和遠(yuǎn)距離的統(tǒng)一,它在同樣的功耗下比傳統(tǒng)的無線射頻通信距離擴(kuò)大3-5倍。 距離往往可達(dá)

    2023年04月08日
    瀏覽(15)
  • 筆記:正點(diǎn)原子LVGLv8.2移植stm32

    筆記:正點(diǎn)原子LVGLv8.2移植stm32

    *移植芯片要求? *16,32或64位微控制器或處理器 *主控頻率:16Mhz *Flash/ROM:64kb,建議180kb以上 *RAM:8kb,建議24kb以上 *圖形緩沖區(qū):水平分辨率像素,建議>1/10屏幕總像素 ?玻珠用了正點(diǎn)原子stm32f407m144最小系統(tǒng)板,滿足要求(具體可查看對(duì)應(yīng)硬件開發(fā)手冊(cè)) *lvglv8.2文件下載? *地址:

    2024年03月14日
    瀏覽(19)
  • 【STM32】學(xué)習(xí)筆記(串口通信)

    【STM32】學(xué)習(xí)筆記(串口通信)

    串口是一種應(yīng)用十分廣泛的通訊接口,串口成本低、容易使用、通信線路簡(jiǎn)單,可實(shí)現(xiàn)兩個(gè)設(shè)備的互相通信 單片機(jī)的串口可以使單片機(jī)與單片機(jī)、單片機(jī)與電腦、單片機(jī)與各式各樣的模塊互相通信,極大地?cái)U(kuò)展了單片機(jī)的應(yīng)用范圍,增強(qiáng)了單片機(jī)系統(tǒng)的硬件實(shí)力。 電平標(biāo)準(zhǔn)

    2024年02月10日
    瀏覽(25)
  • 【【萌新的STM32的學(xué)習(xí)--非正點(diǎn)原子視頻的中斷設(shè)計(jì)思路】】

    【【萌新的STM32的學(xué)習(xí)--非正點(diǎn)原子視頻的中斷設(shè)計(jì)思路】】

    我們分析而言 我們對(duì)于PA0 的設(shè)計(jì)就從此而來 對(duì)于邊沿觸發(fā)的選擇我們已經(jīng)有所了解了 我們下拉,但是當(dāng)我們摁下開關(guān)的時(shí)候 從0到1 導(dǎo)通了 所以這個(gè)是下拉 上升沿觸發(fā) 而對(duì)于KEY0 我們摁下是使得電路從原來懸空高阻態(tài)到地就是0 所以是下降沿觸發(fā) 那么對(duì)于何種模式有很多人

    2024年02月11日
    瀏覽(53)
  • 正點(diǎn)原子STM32嵌入式學(xué)習(xí)-keil5安裝教程

    正點(diǎn)原子STM32嵌入式學(xué)習(xí)-keil5安裝教程

    前言:本人沒有什么嵌入式的經(jīng)驗(yàn),但是看到硬件的同事做開發(fā)板比較好玩,比較感興趣。剛好有這樣一個(gè)機(jī)會(huì),可以跟隨《原子教你玩STM32(庫(kù)函數(shù)版)》課程線下學(xué)習(xí),在此,將本次課程的學(xué)習(xí)做一個(gè)記錄。相信對(duì)我這樣一個(gè)小白來說,幫助還是會(huì)非常大的。 目錄 一.下

    2024年03月10日
    瀏覽(153)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包