stm32 查看stm32串口接收字符串是否是能接收终端

stm32串口怎么判断数据接收完_百度知道
stm32串口怎么判断数据接收完
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你把i定义成全局变量试试,不要在中断函数里面定义你没必要吧结果定义成数组的一部分只需要value=(arry[0]&&8)+arry[1];这样解决应该是没问题的,STM32的串口我用的感觉挺好的,没啥问题
资深电脑人
为您推荐:
其他类似问题
stm32的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。stm32不能进入串口收中断,求解答
我的图书馆
stm32不能进入串口收中断,求解答
博文列表查看方式:
stm32不能进入串口收中断,求解答
发布时间: 15:15:13
技术类别:
打算测试一下stm32的串口控制用法,仿真发现stm32的程序无法进入接收中断,时而会进入void HardFault_Handler(void),难道是中断向量表不对?...
网上找的程序,也搜了一下网上的解答,还是没解决:
ide平台:iar 5.3;
芯片:stm32f103rct6
int main(void){& /*!& At this stage the microcontroller clock setting is already configured, &&&&&& this is done through SystemInit() function which is called from startup&&&&&& file (startup_stm32f10x_xx.s) before to branch to application main.&&&&&& To reconfigure the default setting of SystemInit() function, refer to&&&&&& system_stm32f10x.c file&&&& */&&&& &&&&&& RCC_cfg();&&&&&& GPIO_cfg();&&&&&& NVIC_cfg();&&&&&& USART_cfg();
&&&&&& & /* Output a message on Hyperterminal using USART_senddata() function */&&&&& &&&&& unsigned& char Txmes[100]="hello,welcome to flyarm.cn";
&&&&& for(int i = 0; Txmes[i]!='\0'; ++i)&&&&& {&&&&&&&&& USART_SendData(USART1,Txmes[i]);&&&&&&&&& while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);&&&&& }
& /* Output a message on Hyperterminal using printf function */&&&&& while( 1 )&&&&& {&&&&&&& &&&&& }&
}/**& * @brief& Retargets the C library printf function to the USART.& * @param& None& * @retval None& */
PUTCHAR_PROTOTYPE{& /* Place your implementation of fputc here */& /* e.g. write a character to the USART */& USART_SendData(USART1, (uint8_t) ch);
& /* Loop until the end of transmission */& while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)& {}
#ifdef& USE_FULL_ASSERT
/**& * @brief& Reports the name of the source file and the source line number& *&&&&&&&& where the assert_param error has occurred.& * @param& file: pointer to the source file name& * @param& line: assert_param error line source number& * @retval None& */void assert_failed(uint8_t* file, uint32_t line){ & /* User can add his own implementation to report the file name and line number,&&&& ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
& /* Infinite loop */& while (1)& {& }}#endif
/**& * @}& */ //RCC时钟配置
void RCC_cfg(){&&&&&& ErrorStatus HSEStartUpS//定义错误状态变量&&&&&& RCC_DeInit();//将RCC寄存器重新设置为默认值&&&&&& RCC_HSEConfig(RCC_HSE_ON);//打开外部高速时钟晶振&&&&&& HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟晶振工作
&&&&&& if(HSEStartUpStatus == SUCCESS)
&&&&&& {&&&&&&&&&&&&& RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)为系统时钟&&&&&&&&&&&&& RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(APB2)为HCLK时钟&&&&&&&&&&&&& RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(APB1)为HCLK的2分频&&&&&&&&&&&&& FLASH_SetLatency(FLASH_Latency_2);//设置FLASH代码延时&&&&&&&&&&&&& FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存&&&&&&&&&&&&& &&&&&&&&&&&&& RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz&&&&&&&&&&&&& RCC_PLLCmd(ENABLE);//使能PLL&&&&&&&&&&&&& &&&&&&&&&&&&& while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL准备就绪&&&&&&&&&&&&& RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源
&&&&&&&&&&&&& while(RCC_GetSYSCLKSource() != 0x08);//判断PLL是否是系统时钟
&&&&&&&& //打开GPIO时钟,复用功能,串口1的时钟
&&&&&&&& RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
//IO口配置
void GPIO_cfg(){&&&&&& GPIO_InitTypeDef GPIO_InitS&&&&&& GPIO_StructInit(&GPIO_InitStructure);&&&&&& &&&&&& GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//PA9作为US1的TX端,打开复用,负责发送数据&&&&&& GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&&&&&& GPIO_Init(GPIOA , &GPIO_InitStructure);&&&&&& &&&&&& GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10作为US1的RX端,负责接收数据&&&&&& GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;&&&&&& GPIO_Init(GPIOA, &GPIO_InitStructure);&&&&&& &&&&&& GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//LED显示串口正在发送/接收数据&&&&&& GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&&&&&& GPIO_Init(GPIOD, &GPIO_InitStructure);}//串口初始化
void USART_cfg(){&
&&&&&& USART_InitTypeDef USART_InitS
&&&&&& USART_StructInit(&USART_InitStructure);& //将结构体设置为缺省状态&&& &&&&&& USART_Init(USART1, &USART_InitStructure); //设置串口1&&&&&& &&&&&& USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//打开串口1的收中断响应函数&&&&&& USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//先关闭串口1的发中断响应函数&&&&& &&&&&& USART_Cmd(USART1, ENABLE);//打开串口1&USART_ClearITPendingBit(USART1, USART_IT_TC);//清除中断TC位}
//配置中断
void NVIC_cfg(){&&&&&&& NVIC_InitTypeDef NVIC_InitS
&&&&&&& NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);&&&&&&&&&&&&&& //选择中断分组2&&&&&&& 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);}
/**& * @}& */
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
中断程序如下:
void HardFault_Handler(void){& /* Go to infinite loop when Hard Fault exception occurs */& while (1)& {&&& printf("\n\hard error\n\r");&&&//测试用& }}
void USART1_IRQHandler(void){
& if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)& {&&& /* received data */&&& USART_GetInputString();& }
& /* If overrun condition occurs, clear the ORE flag &&&&&&&&&&&&&&&&&&&&&&&&&&&&& and recover communication */& if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)& {&&& (void)USART_ReceiveData(USART1);& }
& if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)& {&& &&& /* Write one byte to the transmit data register */&&& USART_SendBufferData();& }& && /* 等待串口接收数据完成或缓存区溢出 */&&&&& if (USART_Rx_Done == 1)&&&&& {&&&&&&&& printf("\n\r欢迎使用skater-STM32& You input String is:\n\r");&&&&&&&& printf("[%s]\n\r",USART_Rx_Buffer);&&&&&&&& USART_Rx_Buffer_Clear();&&&&&& }
&&&&&& GPIO_ResetBits(GPIOD, GPIO_Pin_2);&&&&&&&&&&&&&&& //设置led灯亮&&&&&& for (int jack=0;jack&10;++jack)&&&&&& {&&&&&&&& printf("\n\rwelcome to Skater-STM;led on\n\r");&&&&&& }}
[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢STM32F103串口1_USART1查询接收模式-嵌入式系统-电子产品世界
|||||||||||
& STM32F103串口1_USART1查询接收模式
STM32F103串口1_USART1查询接收模式
该程序主要介绍了STM32F103使用查询模式与PC进行串口通信的配置。……
标签:,,,
分享给小伙伴们:
STM32F103串口1_USART1查询接收模式
该用户资料分享
微信公众号二
微信公众号一查看: 605|回复: 1
关于USART2串口接收终端问题
各位大神,才开始学STM32,最近想实现指南者与蓝牙HC-06通信,在给HC-06发送 “AT” 指令时,按理会收到 “OK” 应答,但是没有。查了老半天程序,没有发现错误,帮忙看看。
bsp_usart_blt.h
#define& && && && & BLT_USART_BAUD_RATE& && && && && && && &&&115200
#define& && && && & BLT_USARTx& && && && && && && && && && &&&USART2
#define& && && && & BLT_USART_APBxClock_FUN& && && && && &&&& & & & RCC_APB1PeriphClockCmd
#define& && && && & BLT_USART_CLK& && && && && && && && && &&&RCC_APB1Periph_USART2
#define& && && && & BLT_USART_GPIO_APBxClock_FUN& & & & & & & & & & & & & & & & & & & & & & & & & & & & RCC_APB2PeriphClockCmd
#define& && && && & BLT_USART_GPIO_CLK& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & RCC_APB2Periph_GPIOA& &
#define& && && && & BLT_USART_TX_PORT& && && && && && && && & GPIOA& &
#define& && && && & BLT_USART_TX_PIN& && && && && && && && &&&GPIO_Pin_2
#define& && && && & BLT_USART_RX_PORT& && && && && && && && & GPIOA
#define& && && && & BLT_USART_RX_PIN& && && && && && && && &&&GPIO_Pin_3
#define& && && && & BLT_USART_IRQ& && && && && && && && && &&&USART2_IRQn
#define& && && && & BLT_USART_IRQHandler& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & USART2_IRQHandler
void BLT_USART_Config(void);& &// 配置蓝牙串口
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen );
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str);
void bsp_USART_Process(void);& & // 中断服务程序调用的函数,主要是读取接收到的数据
char *get_rebuff(uint16_t *len);& &
void clean_rebuff(void);复制代码bsp_usart_blt.c
///&&串口2接收中断
static void NVIC_Configuration(void)
{
& & NVIC_InitTypeDef NVIC_InitS
& & /* Configure the NVIC Preemption Priority Bits */
& & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
& & /* Enable the USARTy Interrupt */
& & NVIC_InitStructure.NVIC_IRQChannel = BLT_USART_IRQ;
& & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
& & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
& & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & NVIC_Init(&NVIC_InitStructure);
}
//外部调用配置函数
void BLT_USART_Config(void)
{
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & USART_InitTypeDef USART_InitS
& & & & /* config USART2 clock */
& & & & BLT_USART_APBxClock_FUN(BLT_USART_CLK, ENABLE);
& & & & BLT_USART_GPIO_APBxClock_FUN(BLT_USART_GPIO_CLK, ENABLE);
& & & & /* USART2 GPIO config */
& & & &&&/* Configure USART2 Tx (PA.02) as alternate function push-pull */
& & & & & & & & GPIO_InitStructure.GPIO_Pin = BLT_USART_TX_PIN;
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& & & & & & & & GPIO_Init(BLT_USART_TX_PORT, &GPIO_InitStructure);
& & & && &&&
&&/* Configure USART2 Rx (PA.03) as input floating */
&&GPIO_InitStructure.GPIO_Pin = BLT_USART_RX_PIN;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
&&GPIO_Init(BLT_USART_RX_PORT, &GPIO_InitStructure);
& & & && &
& & & & /* USART2 mode config */
& & & & USART_InitStructure.USART_BaudRate = BLT_USART_BAUD_RATE;
& & & & USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& & & & USART_InitStructure.USART_StopBits = USART_StopBits_1;
& & & & USART_InitStructure.USART_Parity = USART_Parity_N
& & & & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& & & & USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& & & & USART_Init(BLT_USARTx, &USART_InitStructure);
& & & & /* 中断 */
& & & & NVIC_Configuration();
& & & & /* 使能接收中断 */
& & & & USART_ITConfig(BLT_USARTx, USART_IT_RXNE, ENABLE);
& & & & USART_Cmd(BLT_USARTx, ENABLE);
& & & & USART_ClearFlag(BLT_USARTx, USART_FLAG_TC);
}
复制代码然后中断服务入口程序是写在 stm32f10x_it.c 中的。。。问题是发送AT后读不到数据。。。
直接用野火HC05的程序应该能用,改改波特率,看看INT和RST引脚是不是一样
野火电子论坛stm32应用-简单的串口接收与发送程序
> stm32应用-简单的串口接收与发送程序
stm32应用-简单的串口接收与发送程序
//------------------------------------------------------------------//函数名:void Time_Init()//输入参数:null//返回参数:null//说明:定时器初始化函数//------------------------------------------------------------------void Time_Init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseS本文引用地址: 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,继续等待接收USART_1ms_Cnt=0; //当USART_1ms_Cnt>5时对USART_1ms_Cnt重新清零if(RbufCounter==(u16)rx_data[4]+7) //检验数据的完整性{ //定义循环变量data_length=rx_data[4];for(i=0;i{data[i]=rx_data[i];}CRC_data_Hi=rx_data[RbufCounter-1];CRC_data_Lo=rx_data[RbufCounter-2];CRC_data=CRC16((unsigned char*)data,data_length+5);CRC_data_Hi1=CRC_data>>8;CRC_data_Lo1=CRC_data&0x00if(CRC_data_Hi==(u8)CRC_data_Hi1 && CRC_data_Lo==CRC_data_Lo1){for(j=0;rx_data[j]!=;j++) //循环逐字输出,到结束字{USART_SendData(USART1, rx_data[j]); //发送字符while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待字符发送完毕}}}RbufCounter=0;}}}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一}

我要回帖

更多关于 stm32串口接收中断dma 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信