完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
stm32 USB与USART串口数据互转----单纯malloc队列
1.背景
2.2 整体代码逻辑 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yTsxeUM-1610629733744)( 3.malloc动态链表(USART–>USB部分)
typedef struct USART_Recv{ u_char string[64]; //数据空间 uint8_t string_len; //当前数据空间记录的长度 uint32_t *next; //后续节点地址 }Usart_Recv_Buf; 初始化:对USART1~USART4维护的链表分配头节点。此时每条链的R,W都指向同一节点 void Usart_Buf_Init() { uint8_t pos=0; for(pos=0;pos<4;pos++) { Usart_Recv_Buf_Piont[pos][0]=Usart_Recv_Buf_Piont[pos][1]=malloc_free_count(sizeof(Usart_Recv_Buf),0,NULL,0); Usart_Recv_Buf_Piont[pos][0]->next=NULL; Usart_Recv_Buf_Piont[pos][0]->string_len=0; } } 3.2 数据接收
void USART_RXIN_IDLE_Recever(UART_HandleTypeDef *huart,uint8_t index) { if(Usart_Recv_Buf_Piont[index][1]!=NULL) { uint8_t *W_PLen=&(Usart_Recv_Buf_Piont[index][1]->string_len); //当前节点已存储长度 Usart_Recv_Buf **W_Point=&(Usart_Recv_Buf_Piont[index][1]); //当前节点指针 if(__HAL_UART_GET_IT(huart,UART_IT_RXNE)!=RESET) //接收的数据 { if(*W_PLen<64) //当前节点还有空间 (*W_Point)->string[(*W_PLen)++]=huart->Instance->RDR; else //无空间数据丢弃 SET_BIT(USART_MAP[index]->RQR, USART_RQR_RXFRQ);//清空标志位 if((*W_PLen)==64) //当前节点存储已满,需申请新节点 { (*W_Point)->next=malloc_free_count(sizeof(Usart_Recv_Buf),0,NULL,0); if((*W_Point)->next>=0x2000000&&(*W_Point)->next<=0x20004000) //申请节点成功 { (*W_Point)=(*W_Point)->next; //偏移 (*W_Point)->string_len=0; //初始化新节点长度 } else //申请节点失败 { //无需做任何事 } } jishu[0]++; } if(__HAL_UART_GET_IT(huart,UART_IT_IDLE)!=RESET) //一次传输完成标识 { __HAL_UART_CLEAR_IT(huart,UART_CLEAR_IDLEF); //clear flag of RXINE if((*W_PLen)!=0&&(*W_PLen)<64) //防止发送64字节整数倍时,RXNE,IDLE中断同时发送,重复malloc { (*W_PLen)+=LEN_OFFSET; //当无法malloc时,写指针无法下移,造成数据数据暂存无法发送,旧数据被新数据覆盖问题 (*W_Point)->next = malloc_free_count(sizeof(Usart_Recv_Buf),0,NULL,0); if((*W_Point)->next>=0x2000000&&(*W_Point)->next<=0x20004000) //申请节点成功 { (*W_Point)=(*W_Point)->next; //偏移 (*W_Point)->string_len=0; //初始化新节点长度 } else //申请节点失败 { //无需做任何事 } } } } } 3.3 数据发送
void Update_USART_RECV() { static u_int32_t count=0; u_int i,j; u_char *string=NULL; uint8_t len=0; for(i=0;i if(Usart_Recv_Buf_Piont[0]!=NULL&& //防止malloc初始化时就已失败的情况 Usart_Recv_Buf_Piont[0]->string_len>=64&& ((USBD_CDC_HandleTypeDef *)(hU***DeviceFS_CDC.pClassData))->TxState==0) { string=Usart_Recv_Buf_Piont[0]->string; len=Usart_Recv_Buf_Piont[0]->string_len; CDC_Transmit_FS(string, len%LEN_OFFSET, CDC_IN_EP+1+i); count++; //中断冲突问题 printf("Update_USART_RECV:%d:328n",count); } } }
if(Usart_Recv_Buf_Piont[0]!=NULL&& //防止malloc初始化时就已失败的情况 Usart_Recv_Buf_Piont[0]->string_len>=64&& ((USBD_CDC_HandleTypeDef *)(hU***DeviceFS_CDC.pClassData))->TxState==0)
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; PCD_HandleTypeDef *hpcd = pdev->pData; if (pdev->pClassData != NULL) { if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { /* Update the packet total length */ pdev->ep_in[epnum].total_length = 0U; /* Send ZLP */ USBD_LL_Transmit(pdev, epnum, NULL, 0U); // printf("USBD_CDC_DataIn.1264n"); } else { hcdc->TxState = 0U; //完成的标志 if(epnum>=CDC_OUT_EP1&&epnum<=CDC_OUT_EP4) { // printf("USBD_CDC_DataIn:%d free.1278n",epnum); Usart_Recv_Buf *old_send=Usart_Recv_Buf_Piont[epnum-2][0]; if(old_send!=NULL&&old_send->next!=NULL) //有后续节点,free并下移 { Usart_Recv_Buf_Piont[epnum-2][0]=Usart_Recv_Buf_Piont[epnum-2][0]->next; malloc_free_count(0,0,old_send,1); } else if(old_send!=NULL&&old_send->next==NULL) //当节点无法malloc后续节点时,不下移,只将接收长度置0,则此节点可继续使用 { //i old_send->string_len=0; } } } return USBD_OK; } else { return USBD_FAIL; } } 4. USB–>USART模块
运行一段时间后,进入void HardFault_Handler(void)异常中断,malloc在stm32时常返回错误的地址,并且不是NULL,坑爹! |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4138 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3228 浏览 1 评论
2752 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2181 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14980 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3086浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1896浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2066浏览 3评论
1979浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2168浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 09:02 , Processed in 0.619288 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
599