娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32應用-簡單的串口接收與發送程序

發布者:EnchantedHeart最新更新時間:2021-06-02 來源: eefocus關鍵字:STM32  串口接收  發送程序 手機看文章 掃描二維碼
隨時隨地手機看文章

簡介:與上位機串口通信是一個很常用的程序。碧海藍天在剛剛接觸stm32芯片時寫的第一個簡單程序就是串口通信,現在把程序代碼甩出來與大家分享。完整的程序哦。

庫版本 :ST3.0.0


文件:mian.c


//功能:串口初始化、打開定時器中斷,然后一直接收數據狀態就好了。發送在中斷中實現


#include "stm32f10x.h"


#include "usart.h"


u8 USART_rx_data;


int main(void)


{


RCC_Configuration(); //系統時鐘配置


GPIO_Configuration(); //端口初始化


NVIC_Configuration(); //中斷源配置


USART_Configuration(); //串口1初始化


Time_Init(); //定時器初始化


#ifdef DEBUG


debug();


#endif


TIM_Cmd(TIM3,ENABLE);


while(1)


{


}


}


文件:usart.c


#include "stm32f10x.h"


#include "stdio.h"


#include "usart.h"


unsigned char auchCRCHi [256] ={


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,


0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};


unsigned char auchCRCLo [256] ={


0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,


0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,


0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,


0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,


0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,


0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,


0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,


0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,


0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,


0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,


0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,


0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,


0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,


0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,


0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,


0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};


unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen)


{


unsigned char uchCRCHi = 0xFF ;


unsigned char uchCRCLo = 0xFF ;


unsigned char uIndex ;


while (usDataLen--)


{


uIndex = uchCRCHi^*puchMsg++;


uchCRCHi = uchCRCLo^auchCRCHi[uIndex];


uchCRCLo = auchCRCLo[uIndex];


}


return (uchCRCHi << 8 | uchCRCLo) ;


}


void RCC_Configuration(void)


{


ErrorStatus HSEStartUpStatus; //枚舉變量,定義高速時鐘的啟動狀態


RCC_DeInit(); //RCC系統重置,用于Debug目的


RCC_HSEConfig(RCC_HSE_ON); //使能高速時鐘源HSE


HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE穩定


if(HSEStartUpStatus == SUCCESS)


{


FLASH_SetLatency(FLASH_Latency_2);


FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK


RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK


RCC_PCLK1Config(RCC_HCLK_Div2); ///PCLK1 = HCLK/2


RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


RCC_PLLCmd(ENABLE);


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


while(RCC_GetSYSCLKSource() != 0x08){}


}


RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB , ENABLE);


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


}


//------------------------------------------------------------------


//函數名:void GPIO_Configuration()


//輸入參數:null


//返回參數:null


//說明:GPIO初始化函數


//------------------------------------------------------------------


void GPIO_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化結構體聲明


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //復用浮空輸入


GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOB, &GPIO_InitStructure);


}


//------------------------------------------------------------------


//函數名:void NVIC_Configuration()


//輸入參數:null


//返回參數:null


//說明:NVIC初始化函數


//------------------------------------------------------------------


void NVIC_Configuration(void)


{


NVIC_InitTypeDef NVIC_InitStructure; //NVIC初始化結構體聲明


#ifdef VECT_TAB_RAM


NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //如果程序在RAM中調試那么定義中斷向量表在RAM中否則在Flash中


#else


NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);


#endif


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //設置串口1中斷


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級 0


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子優先級為0


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能


NVIC_Init(&NVIC_InitStructure);


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //設置定時器3全局中斷


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級 1


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子優先級為0


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能


NVIC_Init(&NVIC_InitStructure);


}


//------------------------------------------------------------------


//函數名:void USART_Configuration()


//輸入參數:null


//返回參數:null


//說明:串口初始化函數


//------------------------------------------------------------------


void USART_Configuration(void){


USART_InitTypeDef USART_InitStructure; //串口初始化結構體聲明


USART_ClockInitTypeDef USART_ClockInitStruct;


USART_InitStructure.USART_BaudRate = 115200;//設置波特率為115200bps


USART_InitStructure.USART_WordLength = USART_WordLength_8b;//數據位8位


USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位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;//接受和發送模式都打開


USART_ClockInitStruct.USART_Clock=USART_Clock_Disable; //串口時鐘禁止


USART_ClockInitStruct.USART_CPOL=USART_CPOL_Low; //數據低電平有效


USART_ClockInitStruct.USART_CPHA=USART_CPHA_2Edge;//配置CPHA使數據在第2個邊沿的時候被捕獲


USART_ClockInitStruct.USART_LastBit=USART_LastBit_Disable;// 禁用最后一位,使對應的時鐘脈沖不會再輸出到SCLK引腳


USART_ClockInit(USART1, &USART_ClockInitStruct); //配置USART與時鐘相關的設置


USART_Init(USART1, &USART_InitStructure);//配置串口參數函數


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷


//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能發送緩沖空中斷


//USART_ITConfig(USART1, USART_IT_TC, ENABLE);//使能發送完成中斷


USART_ClearFlag(USART1,USART_FLAG_TC); //清除發送完成標志位


USART_Cmd(USART1, ENABLE);//使能串口1


}


//------------------------------------------------------------------


//函數名:void Time_Init()


//輸入參數:null


//返回參數:null


//說明:定時器初始化函數


//------------------------------------------------------------------


void Time_Init(void)


{


TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


TIM_DeInit(TIM3);//復位TIM3定時器


TIM_TimeBaseStructure.TIM_Period =7999; //設置自動重裝載寄存器鎖存值,1ms溢出


TIM_TimeBaseStructure.TIM_Prescaler = 8;//9分頻


TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鐘分頻因子


TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//計數器向上計數模式


TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//寫TIM3各寄存器參數


TIM_ClearFlag(TIM3,TIM_FLAG_Update);


TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);


}


文件:usart.h


#ifndef _USART_H


#define _USART_H


#include


#include "stm32f10x.h"


void RCC_Configuration(void); //聲明RCC初始化函數


void GPIO_Configuration(void); //聲明GPIO初始化函數


void NVIC_Configuration(void); //聲明NVIC初始化函數


void USART_Configuration(void); //聲明串口初始化函數


void Time_Init(void); //聲明定時器初始化函數


unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen);


#endif


文件:stm32f103x_it.c


//需要設置串口接收中斷和定時器3中斷,中斷時間為1ms


//------------------------------------------------------------------


//函數名:void USART1_IRQHandler(void)


//輸入參數:null


//返回參數:null


//說明:串口接收中斷服務


//------------------------------------------------------------------


void USART1_IRQHandler(void)


{


if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判斷讀寄存器是否非空


{


// GPIO_SetBits(GPIOB,GPIO_Pin_6);


rx_data[RbufCounter++]=USART_ReceiveData(USART1); //接收字節到接收緩沖區


if(USART_Rsv_Status==0)


{


if(RbufCounter>1)


{


if(rx_data[0]==0xA5&&rx_data[1]==0x5A) //當接收到的數據幀頭兩個字節同時為0xA5和0x5A時


{


USART_Rsv_Status=1;


// USART_SendData(USART1, rx_data[0]);


}


else


{


rx_data[0]=rx_data[1];


RbufCounter=1;


}


}


}


else


{


USART_1ms_Cnt=0;


}


}


}


//------------------------------------------------------------------


//函數名:void TIM2_IRQHandler(void)


//輸入參數:null


//返回參數:null


//說明:定時器2中斷服務


//------------------------------------------------------------------


void TIM2_IRQHandler(void)


{


}


//------------------------------------------------------------------


//函數名:void TIM3_IRQHandler(void)


//輸入參數:null


//返回參數:null


//說明:定時器3中斷服務


//------------------------------------------------------------------


void TIM3_IRQHandler(void)


{


if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //判斷是否為定時器3溢出中斷


{


GPIO_SetBits(GPIOB,GPIO_Pin_6);


TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清中斷標記


if(USART_Rsv_Status==1)


USART_1ms_Cnt++;


if(USART_1ms_Cnt>5)


{


// USART_SendData(USART1,0xAA);


USART_Rsv_Status=0;//連續計數超過5次對USART_Rsv_Status置0,繼續等待接收

[1] [2]
關鍵字:STM32  串口接收  發送程序 引用地址:STM32應用-簡單的串口接收與發送程序

上一篇:stm單片機io管腳翻轉實驗
下一篇:對位操作由別名轉換到位的方法

推薦閱讀最新更新時間:2025-06-03 19:12

STM32 串口3 總是進入接收中斷
近日,調試stm32f103串口3 發現一個奇怪的問題 USART3------------RXD----------PB11 懸空會導致程序頻繁進入串口接收中斷!!! //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11 原因就是 PB11引腳配置成了浮空輸入模式!!!! 改成上拉輸入問題解決
[單片機]
STM32串口1發送接收DMA模式函數配置
/********************************************************************************** **函數名稱:void USART1_Config(void) **函數功能:USART1串口引腳初始化 **輸入參數:無 **返回參數:無 **函數調用:內部調用 **********************************************************************************/ static void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructu
[單片機]
STM32串口如何代碼實現更穩定的接收消息
在 《STM32串口向世界問好》介紹過如何發送消息,那么又如何接收消息呢? 也很簡單,只需要配置好串口接收,配置好中斷,并在串口中斷函數里面進行數據接收就可以了。通用配置代碼如下: /** * @brief 初始化IO 串口1 * @param bound:波特率 * @retval None */void USART1_Debug_Init(u32 bound){ //GPIO端口設置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
[單片機]
<font color='red'>STM32</font><font color='red'>串口</font>如何代碼實現更穩定的<font color='red'>接收</font>消息
msp430 f5529寄存器 串口發送接收
使用的開發板是官方的ti msp430f5529lp 基于官方的例程進行的改動 新增了發送字符串函數 同時可以中斷接收 接下來看代碼展示 #include msp430.h volatile unsigned int i; void senfchar(char s) { UCA0TXBUF=s; while(!(UCA0IFG&UCTXIFG)); } void sendstring(unsigned char *p) { while(*p!='') { while(!(UCA0IFG&UCTXIFG)); UCA0TXBUF=*p++; } } void
[單片機]
msp430 f5529寄存器 <font color='red'>串口</font><font color='red'>發送</font><font color='red'>接收</font>
串口不定長接收數據--空閑中斷方式測試
1.問題描述: 使用串口的空閑中斷和接收中斷進行串口數據的不定長接收 2.測試平臺: (1)芯片STM32F756VGT6 (2)IAR軟件環境 (3)使用芯片的串口6,和外接的RS485收發模塊一起用做RS485通訊 3.實際操作: (1)串口初始化: void MX_UART6_Init(void) { huart6.Instance = USART6; huart6.Init.BaudRate = 115200; huart6.Init.WordLength = UART_WORDLENGTH_8B; huart6.Init.StopBits = UART_STOPBITS_1
[單片機]
C51 串口收發,printf, 接收字符串
串口發送,接收 在while(1){printf(“xxx”); delay(100); //此處需要有delay函數;} #include reg51.h //stdio.h,string.h用于printf函數原型 #include stdio.h void delay(unsigned int z) { unsigned int x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } void uart_init(void) { TMOD=0x20;//即0010 0000,定時器/計數器1,工作方式2 TH1=0xe6;//設置波
[單片機]
C51串口中斷---接收發送
C51單片機(STC11L32/48/60XE)的串口中斷處理函數,如果在使能串口中斷后,有接收或者發送數據時,就會設置中斷標志位,進而處理中斷函數。 接收數據,設置RI=1,處理完中斷函數后,再設置RI=0。同理,發送數據,設置TI=1,處理完中斷函數后,再設置TI=0。
[單片機]
stm32f103c6串口發送程序
人單片機萌新一枚,最近用protues仿真stm32f103c6進行串口數據,另外protues仿真還有一個bug,必須在前面加上 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);否則會一直發送0x00. 單片機源程序如下: #include stm32f10x.h #include stm32f10x_it.h #include led.h #include modbus.h #include delay.h void SystemTick_Configuration( void ); int main(void) { RCC_SYSCLKConfi
[單片機]
stm32f103c6<font color='red'>串口</font><font color='red'>發送</font><font color='red'>程序</font>
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 林西县| 阜新| 宝丰县| 赞皇县| 铁岭市| 巴南区| 阳谷县| 安康市| 乐至县| 同江市| 合肥市| 高州市| 大渡口区| 云阳县| 白银市| 姜堰市| 西平县| 屏南县| 象州县| 获嘉县| 平阳县| 彰化市| 礼泉县| 大埔县| 栾川县| 邯郸市| 东莞市| 榆树市| 大厂| 内江市| 星子县| 左云县| 广西| 东莞市| 和林格尔县| 积石山| 嘉黎县| 黄冈市| 衡水市| 余庆县| 赣榆县|