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

歷史上的今天

今天是:2025年06月02日(星期一)

2021年06月02日 | STM32應用-簡單的串口接收與發送程序

發布者:EnchantedHeart 來源: 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管腳翻轉實驗
下一篇:對位操作由別名轉換到位的方法

推薦閱讀

中國無人機產業創新聯盟成立大會在北京召開。中國無人機產業創新聯盟是由北京市信息技術研究所、中國電子信息產業發展研究院、中國光學工程學會、深圳大疆創新科技有限公司等單位聯合國內上百家無人機知名企業、科研院所共同發起,整合產學研用各方力量的開放型非盈利性社會組織。作為行業協會中的“國家隊 ”,中國無人機產業創新聯盟可謂陣容豪華,其專...
清潔、物流、陪伴……機器人正在越來越多地應用在人們的日常生活中。如今,在北京的民警基層工作中也將出現機器人的身影。未來,當你走在北京各個地區的公安服務大廳、派出所,將可以看到警務機器人在24小時無人警務室值守,在公安服務大廳幫助市民咨詢和引導辦理戶政業務、出入境業務。在室外的小區、園區中,也將能看到和警車配色相近的機器人進行巡邏...
在美國對華為祭出越來越嚴格的出口限制之后,華為正在摸索新的出路以對抗措施。此前就有消息稱,華為正在與僅次于美國高通的全球第二大移動芯片開發商聯發科,以及僅次于華為海思的中國大陸第二大移動芯片制造商紫光展銳進行談判,為保證其消費電子業務的繼續運營而購買更多芯片作為替代方案。今(1)日,據日經中文網報道,中國大陸企業為了探索“漏洞”...
企查查顯示,哈勃科技投資有限公司(簡稱:哈勃)發生工商變更,注冊資本由270000萬元增加至300000萬元,增幅達11.11%。圖片來源:企查查哈勃成立于2019年4月,由華為投資控股有限公司全資控股。集微網此前統計顯示,2020年哈勃投資或超18家半導體領域企業。今年以來,哈勃已陸續投資粒界科技、無錫飛譜電子、本諾電子、立芯軟件、上揚軟件等企業。

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 阿克| 长寿区| 常德市| 阜宁县| 霍州市| 丰宁| 公主岭市| 内江市| 青铜峡市| 平江县| 吉首市| 天镇县| 金门县| 高清| 巴彦淖尔市| 曲阜市| 勐海县| 阿图什市| 商城县| 钦州市| 徐州市| 龙南县| 余干县| 吉安市| 育儿| 彩票| 西宁市| 鄯善县| 宜阳县| 南昌县| 嘉定区| 磐石市| 沙河市| 朝阳市| 汽车| 扶沟县| 洛阳市| 元江| 贞丰县| 南召县| 交口县|