-
N32G455 RS485中断接收函数进入不了,请问是什么原因呀?
RS485能够发送数据,但是接收数据时一直进不了RS485中断函数,请大佬们指点一下[color=#d4d4d4][backcolor=rgb(30, 30, 30)][font=Consolas, "][size=15.4px][color=#569cd6]void[/color] [color=#dcdcaa]RS485_Init[/color]([color=#569cd6]void[/color]) { [color=#4ec9b0]GPIO_InitType[/color] [color=#9cdcfe]GPIO_InitStruct[/color]; [color=#4ec9b0]USART_InitType[/color] [color=#9cdcfe]USART_InitStruct[/color]; [color=#4ec9b0]NVIC_InitType[/color] [color=#9cdcfe]NVIC_InitStruct[/color]; [color=#6a9955]// 使能时钟(USART2在APB1总线上)[/color] [color=#dcdcaa]RCC_EnableAPB2PeriphClk[/color]([color=#569cd6]RCC_APB2_PERIPH_GPIOA[/color], [color=#4fc1ff]ENABLE[/color]); [color=#dcdcaa]RCC_EnableAPB1PeriphClk[/color]([color=#569cd6]RCC_APB1_PERIPH_USART2[/color], [color=#4fc1ff]ENABLE[/color]); [color=#6a9955]// 配置方向控制引脚PA1[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]RS485_EN_GPIO_PIN[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_Out_PP[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Speed[/color] = [color=#4fc1ff]GPIO_Speed_50MHz[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#dcdcaa]GPIO_ResetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]);[color=#6a9955] // 默认接收模式[/color] [color=#6a9955]// 配置USART2 TX引脚PA2(复用推挽输出)[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]GPIO_PIN_2[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_AF_PP[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]GPIOA[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#6a9955]// 配置USART2 RX引脚PA3(浮空输入)[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]GPIO_PIN_3[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_IN_FLOATING[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]GPIOA[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#6a9955]// USART参数配置[/color] [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]BaudRate[/color] = [color=#b5cea8]9600[/color];[color=#6a9955] // 波特率;[/color] [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]WordLength[/color] = [color=#569cd6]USART_WL_8B[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]StopBits[/color] = [color=#569cd6]USART_STPB_1[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]Parity[/color] = [color=#569cd6]USART_PE_NO[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]HardwareFlowControl[/color] = [color=#569cd6]USART_HFCTRL_NONE[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]Mode[/color] = [color=#569cd6]USART_MODE_RX[/color] | [color=#569cd6]USART_MODE_TX[/color]; [color=#dcdcaa]USART_Init[/color]([color=#569cd6]USART2[/color], &[color=#9cdcfe]USART_InitStruct[/color]); [color=#6a9955]// 使能接收中断[/color] [color=#dcdcaa]USART_ConfigInt[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_RXDNE[/color], [color=#4fc1ff]ENABLE[/color]); [color=#dcdcaa]USART_ConfigInt[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_IDLEF[/color], [color=#4fc1ff]ENABLE[/color]); [color=#6a9955]// 配置NVIC[/color] [color=#dcdcaa]NVIC_PriorityGroupConfig[/color]([color=#569cd6]NVIC_PriorityGroup_2[/color]); [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannel[/color] = [color=#4fc1ff]USART2_IRQn[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelPreemptionPriority[/color] = [color=#b5cea8]1[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelSubPriority[/color] = [color=#b5cea8]1[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelCmd[/color] = [color=#4fc1ff]ENABLE[/color]; [color=#dcdcaa]NVIC_Init[/color](&[color=#9cdcfe]NVIC_InitStruct[/color]); [color=#6a9955]// 使能USART[/color] [color=#dcdcaa]USART_Enable[/color]([color=#569cd6]USART2[/color], [color=#4fc1ff]ENABLE[/color]); } [color=#6a9955]// 发送函数[/color] [color=#569cd6]void[/color] [color=#dcdcaa]RS485_SendData[/color]([color=#4ec9b0]uint8_t[/color] *[color=#9cdcfe]pData[/color], [color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]len[/color]) { [color=#6a9955]// 设置为发送模式[/color] [color=#dcdcaa]GPIO_SetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]); [color=#6a9955]// 阻塞式发送数据[/color] [color=#c586c0]for[/color] ([color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]i[/color] = [color=#b5cea8]0[/color]; [color=#9cdcfe]i[/color] < [color=#9cdcfe]len[/color]; [color=#9cdcfe]i[/color]++) { [color=#6a9955]//[/color] [color=#c586c0]while[/color] ([color=#dcdcaa]USART_GetFlagStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_TXDE[/color]) == [color=#4fc1ff]RESET[/color]) ;[color=#6a9955] // 等待发送完成[/color] [color=#dcdcaa]USART_SendData[/color]([color=#569cd6]USART2[/color], [color=#9cdcfe]pData[/color][[color=#9cdcfe]i[/color]]); } [color=#6a9955]// 确保最后一位发送完成[/color] [color=#c586c0]while[/color] ([color=#dcdcaa]USART_GetFlagStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_TXC[/color]) == [color=#4fc1ff]RESET[/color]) ; [color=#6a9955]// 恢复接收模式[/color] [color=#dcdcaa]GPIO_ResetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]); } [color=#6a9955]// 接收缓冲区和索引[/color] [color=#c586c0]#define[/color][color=#569cd6] [/color][color=#569cd6]RX_BUF_SIZE[/color][color=#569cd6] [/color][color=#b5cea8]128[/color] [color=#569cd6]volatile[/color] [color=#4ec9b0]uint8_t[/color] [color=#9cdcfe]rxBuffer[/color][[color=#569cd6]RX_BUF_SIZE[/color]]; [color=#569cd6]volatile[/color] [color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]rxIndex[/color] = [color=#b5cea8]0[/color]; [color=#569cd6]void[/color] [color=#dcdcaa]RS485_IRQHandler[/color]([color=#569cd6]void[/color]) { [color=#c586c0]if[/color] ([color=#dcdcaa]USART_GetIntStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_RXDNE[/color]) != [color=#4fc1ff]RESET[/color]) { [color=#9cdcfe]rxBuffer[/color][[color=#9cdcfe]rxIndex[/color]++] = [color=#dcdcaa]USART_ReceiveData[/color]([color=#569cd6]USART2[/color]); } [color=#c586c0]if[/color] ([color=#dcdcaa]USART_GetIntStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_IDLEF[/color]) != [color=#4fc1ff]RESET[/color]) { [color=#c586c0]if[/color] ([color=#9cdcfe]rxBuffer[/color][[color=#b5cea8]0[/color]] == [color=#b5cea8]0xAA[/color]) { [color=#dcdcaa]printf[/color]([color=#ce9178]"rxBuffer = [/color][color=#9cdcfe]%x[/color][color=#d7ba7d]\r\n[/color][color=#ce9178]"[/color], [color=#9cdcfe]rxBuffer[/color][[color=#b5cea8]0[/color]]); } } [color=#9cdcfe]rxIndex[/color] = [color=#b5cea8]0[/color]; [color=#dcdcaa]USART_ClrIntPendingBit[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_IDLEF[/color]);[color=#6a9955]// 清除空闲中断[/color] [color=#6a9955] /*清除空闲中断*/[/color] [color=#569cd6]USART2[/color]->[color=#9cdcfe]STS[/color]; [color=#569cd6]USART2[/color]->[color=#9cdcfe]DAT[/color]; } [/size][/font][/backcolor][/color]
1852浏览量 17回复量 关注量 -
N32G455定时器捕获偶尔会丢一个沿的问题
[i=s] 本帖最后由 通讯不上 于 2024-2-21 14:02 编辑 [/i] 使用定时器一个通道捕获频率时偶尔出现频率只有一半的问题。检查重复捕获标志位没有异常。信号源和电路应该没有问题,用pwm模式捕获的话是正常的,求助!!!部分代码: void inline pwm_compute(uint8_t idx) { // uint32_t first_val = 0; uint16_t cap_val = 0u; //进来先读值 uint8_t i = 0; //避免在处理这个中断时update没来得及处理导致计算不准确 switch (idx) { case 0: cap_val = TIM_GetCap1(TIM5); break; case 1: cap_val = TIM_GetCap2(TIM5); break; case 2: cap_val = TIM_GetCap3(TIM5); break; case 3: cap_val = TIM_GetCap4(TIM5); break; default: break; } if(ic_info[idx].ic_capnum == 0) { /* Get the Input Capture value */ ic_info[idx].ic_freq_delval = cap_val; //TIM_ConfigOc1Polarity(TIM5,TIM_IC_POLARITY_FALLING); ic_info[idx].ic_capnum = 2; // 1是有占空比 ic_info[idx].ic_overcnt = 0; } else if(ic_info[idx].ic_capnum == 1) { /* Get the Input Capture value */ ic_info[idx].ic_duty_delval = ic_info[idx].ic_overcnt * 65535 + cap_val - ic_info[idx].ic_freq_delval; TIM_ConfigOc1Polarity(TIM5,TIM_IC_POLARITY_RISING); ic_info[idx].ic_capnum = 2; } else if(ic_info[idx].ic_capnum == 2) { /* Get the Input Capture value */ // first_val = ic_info[idx].ic_freq_delval; if(cap_val < ic_info[idx].ic_freq_delval && ic_info[idx].ic_overcnt == 0) { i = 1; } ic_info[idx].ic_freq_delval = (ic_info[idx].ic_overcnt +i)* 65535 + cap_val - ic_info[idx].ic_freq_delval; //dev_printf("del1 =%d",ic_info[idx].ic_freq_delval); //TIM_ConfigOc1Polarity(TIM5,TIM_IC_POLARITY_RISING); ic_info[idx].ic_freq = (uint32_t) (18000000 * 1.0 / ic_info[idx].ic_freq_delval + 0.5); ic_info[idx].ic_duty = (uint32_t) ((float)ic_info[idx].ic_duty_delval * 1.0 / ic_info[idx].ic_freq_delval)*1000; //ic_info[idx].ic_capnum = 0; if(ic_info[idx].ic_freq < 480) { dev_printf("freq =%d\n",ic_info[idx].ic_freq); // first_val = 0; } //全波形测量 ic_info[idx].ic_freq_delval = cap_val; ic_info[idx].ic_overcnt = 0; } void PI_IRQHandlerCallback(void) { uint8_t i = 0; if(TIM_GetIntStatus(TIM5, TIM_INT_UPDATE) == SET) { for(i = 0;i<4;i++) { if(TIM_GetIntStatus(TIM5, (TIM_INT_CC1<pi1) { dev_pi_get_fd(bd_r->pi1,ic_info[0].ic_freq,ic_info[0].ic_duty); } } if(TIM_GetIntStatus(TIM5, TIM_INT_CC2) == SET) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClrIntPendingBit(TIM5, TIM_INT_CC2); pwm_compute(1); if(bd_r && bd_r->pi2) { dev_pi_get_fd(bd_r->pi2,ic_info[1].ic_freq,ic_info[1].ic_duty); } } if(TIM_GetIntStatus(TIM5, TIM_INT_CC3) == SET) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClrIntPendingBit(TIM5, TIM_INT_CC3); pwm_compute(2); if(bd_r && bd_r->pi3) { dev_pi_get_fd(bd_r->pi3,ic_info[2].ic_freq,ic_info[2].ic_duty); } } if(TIM_GetIntStatus(TIM5, TIM_INT_CC4) == SET) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClrIntPendingBit(TIM5, TIM_INT_CC4); pwm_compute(3); if(bd_r && bd_r->pi4) { dev_pi_get_fd(bd_r->pi4,ic_info[3].ic_freq,ic_info[3].ic_duty); } } } } [/i]
1486浏览量 1回复量 关注量 -
N32G455的RTC断电复位问题
硬件上,CR2032直接对VBAT供电。软件初始化没有主动改写日历。 多次通断电会导致日历被清零,时间正常往前走。 请问这是什么原因导致的。谢谢
923浏览量 1回复量 关注量