shipeng

个性签名:模电临时工

    1. 关于FreeRTOS的任务消息替代事件组问题 5/413 实时操作系统RTOS 2024-07-21
      freebsder 发表于 2024-7-16 15:24 看看它下面的定时器是什么情况
      不知是哪个下面的定时器?
    2. FreeRTOS怎样分配任务堆栈大小 9/1279 stm32/stm8 2024-07-15
      freebsder 发表于 2024-7-15 18:50 现在的IDE对freertos支持挺好的,你翻翻应该还有线程插件
      这个有,之前用TI的CCS有用过,调试的时候可以发挥大用,STM32CubeIDE找了一下也有不过还没使用过
    3. FreeRTOS怎样分配任务堆栈大小 9/1279 stm32/stm8 2024-07-15
      walker2048 发表于 2024-7-14 22:25 首先、你可以定期打印堆栈大小和占用比例,设置超过80%或者多少就打印错误。 其次、Static Stack Anal ...
      我觉得定期打印的办法有很高的局限性,没有出现堆栈溢出的时候还能看一下堆栈的使用情况,如果真出现堆栈溢出了定期打印根本来不及反应就进入HardFault了
    4. FreeRTOS怎样分配任务堆栈大小 9/1279 stm32/stm8 2024-07-14
      walker2048 发表于 2024-7-14 10:48 FreeRTOS自己就有堆栈占用和CPU占用分析,好好用工具也容易发现问题
      这种的需要在软件运行以后串口打印出来吧?如果发生堆栈溢出程序就进入HardFault了你这个工具就失去作用了吧? Static Stack Analyzer工具不需要debug也不需要把程序烧写进MCU,只要编译完了就可以直接看到每个任务的堆栈需求大小
    5. 关于FreeRTOS的任务消息替代事件组问题 5/413 实时操作系统RTOS 2024-07-13
      Jacktang 发表于 2024-7-13 09:19 当DMA传输完成后置位“CPL_U3TX_SIG”任务消息,此时任务中ReadEvent = osSignalWait(ACK_U3TX_S ...
      “CPL_U3TX_SIG”消息位用来指示DMA传输完成,"ACK_U3TX_SIG"消息位我在串口接收处理中置位,用来指示串口数据收到从机应答不需要再重发此数据了。因为我做了一个串口数据重发机制,只有收到目标设备应答才会退出重发,否则会重发10次数据。
    6. osPriorityRealtime任务不能被终止 3/684 实时操作系统RTOS 2024-03-25
      wangerxian 发表于 2024-3-25 15:17 意思是想开机时,先停止GUI任务创建的线程?
      是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有这个选项,只要你在.ioc文件中新增了某个任务那么这个任务默认就在FRERTOS_Init()函数中被创建了你没得选。当然你也可以选择全手动创建这个任务就没有这个问题了,但我却没有这么干因此遇到了问题,发出来希望能帮助到有缘人
    7. TM4C123芯片锁死无法烧写 4/3334 DSP 与 ARM 处理器 2024-03-14
      研究了半天发现我这个不是芯片锁死的问题,换了一个第三方做的XDS100V3发现可以正常烧写程序了,感情官方的大几千块的XDS110还不如一百块的第三方XDS100V3好用,我也是服了TI
    8. TM4C123芯片锁死无法烧写 4/3334 DSP 与 ARM 处理器 2024-03-11
      Jacktang 发表于 2024-3-10 15:18 分享一下别人的方法,可能不一定解决楼主的问题,可以借鉴一下   由于本人刚接触到TM4C123Glaun ...
      感谢大佬热情回复
    9. FreeRTOS中的互斥锁在中断中Give 7/975 实时操作系统RTOS 2023-12-23
      本帖最后由 shipeng 于 2023-12-23 17:14 编辑
      lugl4313820 发表于 2023-12-23 10:15 现在最新版的好象说修复了这个问题,楼主可以去试试。
      不知道我用的是不是最新版,总之用了互斥量就一堆的问题,各种报Assert错误,我也不知道是不是因为谁上锁谁解锁的原因导致的。总之如果遵循谁上锁谁解锁的原则使用互斥量就可以运行。否则就会报各种ASSERT错误。如果把互斥量换成二值信号量就没有这个问题。 下面是我的源码,说一下我的软件逻辑:每次DMA传输完成后启动一个10毫秒定时器,在定时器回调函数中Give互斥量。从而保证帧最小间隔为10毫秒,以防止发送帧粘连。 SemaphoreHandle_t DMA2C5MuxSem_Handle = NULL; TimerHandle_t xHandleTimerU4Tx = NULL; TaskHandle_t xHandleTaskU4TX = NULL; static void U4TxTimerCallback(void); static void CreateU4TxFrameDelay(TickType_t xTimerPeriodInTicks ); static void vTaskU4TX_Handler(void *pvParameters); void UART4_DMA_Init(void); void BSP_UART4_Init(void); void BSP_USART_Config(void) { BSP_UART4_Init(); UART4_DMA_Init(); NVIC_EnableIRQRequest(UART4_IRQn, 2, 0); USART_EnableInterrupt(UART4, USART_INT_IDLE); /* Enable UART4 RX and UART4 TX DMA */ USART_EnableDMA(UART4, USART_DMA_TX_RX); U4RxQueue = xQueueCreate(U4RX_QUE_DEPTH, U4RX_QUE_SIZE);//msgs , length of msg(byte) if (NULL==U4RxQueue)printf("U4RxQueue Creating Failed!\r\n"); U4TxQueue = xQueueCreate(4, 4); if (NULL==U4TxQueue)printf("U4TxQueue Creating Failed!\r\n"); #ifndef USE_DMA_WITH_MUTEX DMA2C5MuxSem_Handle = xSemaphoreCreateBinary(); #else DMA2C5MuxSem_Handle = xSemaphoreCreateMutex(); #endif if (NULL==DMA2C5MuxSem_Handle)printf("DMA2C5MuxSem Creating Failed!\r\n"); #ifndef USE_DMA_WITH_MUTEX else if (0==uxSemaphoreGetCount(DMA2C5MuxSem_Handle) && pdPASS!=xSemaphoreGive(DMA2C5MuxSem_Handle))printf("DMA2C5MuxSem Giving Failed!\r\n"); #endif CreateU4TxFrameDelay(10); xTaskCreate((TaskFunction_t )vTaskU4TX_Handler, (const char* )"UART4 TX Task", (uint16_t )256, (void* )NULL, (UBaseType_t )5, (TaskHandle_t* )&xHandleTaskU4TX); } static void U4TxTimerCallback(void) { #ifndef USE_DMA_WITH_MUTEX if (0==uxSemaphoreGetCount(DMA2C5MuxSem_Handle) && pdPASS != xSemaphoreGive( DMA2C5MuxSem_Handle))printf("DMA2C5MuxSem Giving failed!"); #else if (NULL!=xSemaphoreGetMutexHolder(DMA2C5MuxSem_Handle) && pdPASS != xSemaphoreGive( DMA2C5MuxSem_Handle))printf("DMA2C5MuxSem Giving failed!"); #endif else if (0!=uxQueueMessagesWaiting(U4TxQueue))portYIELD();//if the queue is not empty,then request a context switch } static void CreateU4TxFrameDelay(TickType_t xTimerPeriodInTicks ) { xHandleTimerU4Tx = xTimerCreate("U4TxTimer",xTimerPeriodInTicks,pdFALSE,(void*)3,(TimerCallbackFunction_t)U4TxTimerCallback); if (NULL==xHandleTimerU4Tx)printf("U4TxTimer Creating failed!"); } static void vTaskU4TX_Handler(void *pvParameters) { UsartTxRxBuffer_t *tx_buffer; while(1) { if (pdPASS==xQueueReceive(U4TxQueue, (uint8_t*)&tx_buffer, portMAX_DELAY)) { xSemaphoreTake(DMA2C5MuxSem_Handle, 5689U);//5689ms Is The MAX TIME of DMA-UART-Tx,65536bytes*1000ms/11520(byte rate)=5688.888... if (0!=tx_buffer->length) { /* Disable TX DMA */ DMA_Disable(DMA2_Channel5); memcpy(DMA_UART4_TxBuf,tx_buffer->DatArea,tx_buffer->length); DMA2_Channel5->CHNDATA_B.NDATA = tx_buffer->length; /* Enable TX DMA */ DMA_Enable(DMA2_Channel5); } if (NULL!=tx_buffer)vPortFree((uint8_t*)tx_buffer); } } } void DMA2_Channel5_IRQHandler(void) { if (RESET != DMA_ReadIntFlag(DMA2_INT_FLAG_TC5)) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; DMA_ClearIntFlag(DMA2_INT_FLAG_TC5); if (NULL!=xHandleTimerU4Tx) { xTimerResetFromISR(xHandleTimerU4Tx,&xHigherPriorityTaskWoken); } } } void UART4_DMA_Init(void) { DMA_Config_T dmaConfig; /* Enable DMA Clock */ RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA2); /* TX DMA config */ dmaConfig.peripheralBaseAddr = UART4_DR_ADDRESS; dmaConfig.memoryBaseAddr = (uint32_t)DMA_UART4_TxBuf; dmaConfig.dir = DMA_DIR_PERIPHERAL_DST; dmaConfig.bufferSize = 0; dmaConfig.peripheralInc = DMA_PERIPHERAL_INC_DISABLE; dmaConfig.memoryInc = DMA_MEMORY_INC_ENABLE; dmaConfig.peripheralDataSize = DMA_PERIPHERAL_DATA_SIZE_BYTE; dmaConfig.memoryDataSize = DMA_MEMORY_DATA_SIZE_BYTE; dmaConfig.loopMode = DMA_MODE_NORMAL; dmaConfig.priority = DMA_PRIORITY_HIGH; dmaConfig.M2M = DMA_M2MEN_DISABLE; /* Enable DMA channel */ DMA_Config(DMA2_Channel5, &dmaConfig); /* Enable TX DMA */ DMA_Enable(DMA2_Channel5); NVIC_EnableIRQRequest(DMA2_Channel5_IRQn, 3, 0); DMA_EnableInterrupt(DMA2_Channel5, DMA_INT_TC); /* RX DMA Configure */ dmaConfig.dir = DMA_DIR_PERIPHERAL_SRC; dmaConfig.loopMode = DMA_MODE_CIRCULAR; dmaConfig.bufferSize = sizeof(DMA_UART4_RxBuf); dmaConfig.memoryBaseAddr = (uint32_t)DMA_UART4_RxBuf; /* Enable DMA channel */ DMA_Config(DMA2_Channel3, &dmaConfig); /* Enable RX DMA */ DMA_Enable(DMA2_Channel3); // NVIC_EnableIRQRequest(DMA2_Channel3_IRQn, 1, 0); // DMA_EnableInterrupt(DMA2_Channel3, DMA_INT_TC); } void BSP_UART4_Init(void) { GPIO_Config_T GPIO_ConfigStructure; USART_Config_T USART_ConfigStruct; RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOC)); RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_UART4)); /*Uart4 TX*/ GPIO_ConfigStructure.pin = GPIO_PIN_10; GPIO_ConfigStructure.speed = GPIO_SPEED_50MHz; GPIO_ConfigStructure.mode = GPIO_MODE_AF_PP; GPIO_Config(GPIOC, &GPIO_ConfigStructure); /*Uart4 RX*/ GPIO_ConfigStructure.pin = GPIO_PIN_11; GPIO_ConfigStructure.mode = GPIO_MODE_IN_FLOATING; GPIO_Config(GPIOC, &GPIO_ConfigStructure); USART_ConfigStruct.baudRate = 115200; USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE; USART_ConfigStruct.mode = USART_MODE_TX_RX; USART_ConfigStruct.parity = USART_PARITY_NONE; USART_ConfigStruct.stopBits = USART_STOP_BIT_1; USART_ConfigStruct.wordLength = USART_WORD_LEN_8B; USART_Config(UART4, &USART_ConfigStruct); USART_Enable(UART4); }  
    10. STM32 调试可以运行退出调试跑飞 6/1355 stm32/stm8 2023-12-07
      本帖最后由 shipeng 于 2023-12-7 19:44 编辑 我发这个贴子的主要目的有两个: 1.希望可以帮到有缘人; 2.为了说明一个道理希望能给大家一些启示:很多仿真分析的问题表象都是误导人的就是为了把你骗进坑里面,关键还是要用printf靠谱点。 我话说完,谁赞成谁反对?
    11. STM32 调试可以运行退出调试跑飞 6/1355 stm32/stm8 2023-12-04
      秦天qintian0303 发表于 2023-12-1 23:51 printf打印是在哪里的?你的程序应该是已经跑飞,只能收到跑飞前的,还是好好检查一下跳转吧,可以加一下 ...
      问题是已经解决了,只是付出的代价有点高,花了好几天时间才解决。由于printf功能异常导致我错误高估了问题的复杂性,而且从问题的表象分析指向了一个完全错误的方向。
    12. STM32 调试可以运行退出调试跑飞 6/1355 stm32/stm8 2023-12-01
      秦天qintian0303 发表于 2023-12-1 10:30 直接跳转操作还是要慎之又慎,引导和应用部分应该是分别编译的吧,之后要和到一块在下载进去,单独调试肯定 ...
      是的,单独调应用部分发现可以正常进入main函数,但是你让他自己跑就又不行了不知道跑到哪里去了,说来也是巧合刚好我的printf打印又出了问题,有时能打印有时又不行,如果打印功能正常我也早发现问题的根源了,刚好第一次用SWV打印调试问题多如牛毛,打印就像双缝干涉时有时无,BUG掩护BUG再牛逼的人也很难发现更何况是菜鸡如我。
    13. 无稳态多谐振荡器的修改电路深入讨论 61/10885 模拟电子 2023-11-30
      MrCU204 发表于 2023-10-22 21:26 Q1 饱和,C1 放电,Q2 截止, 但是,Q1 饱和谁支持,是 C2,  C2 的电流随充电而减小,但须足 ...
      我数学不好给你粗略的估算一下:C1=C2,C2的充电RC值=C2*11KΩ,另外C1的放电RC值=C1*1K。Q1的电流放大作用支持Q1维持足够长时间的饱和导通。所以你说能不能做到。
    14. 电子工程师从入门到精通 8/2512 下载中心专版 2023-10-05
      不错!全彩图解这一点诚意拉满,是一本老少咸宜不可多得的电子技术入门圣经
    15. STM32F103RC UART1奇怪的BUG 19/14207 stm32/stm8 2023-09-04
      辛昕 发表于 2023-8-31 12:23 因为平常写东西,不是用库就是封装成函数,所以可能就过去了。 这个问题,最大的问题就是忘了一句话&mda ...
    16. STM32F103RC UART1奇怪的BUG 19/14207 stm32/stm8 2023-08-30
      hjl2832 发表于 2023-8-20 20:33 你没认真看好用户手册,你的代码里不能用延时来代替读状态位清除TC标志的  因为你没清TC,所以你在写 ...
      道理是这个道理,那么多年前的老帖子我也不记得当初为啥要纠结这个小问题
    17. PVD断电写入方式FLASH模拟EEPROM 6/1877 stm32/stm8 2023-07-21
      jobszheng5 发表于 2023-7-21 10:12 楼主放心应用吧! 我在我的项目里面已经验证通过了。 实际应用效果相当完美
      其实我也已经用到项目里面了,谢谢你的回馈,能够帮到大家我很欣慰
    18. PVD断电写入方式FLASH模拟EEPROM 6/1877 stm32/stm8 2023-07-20
      火辣西米秀 发表于 2023-7-19 22:43 要求断电后数据不能丢失,直到用户操作清零后重新开始计数,楼主的解决方案是刚刚的,不错
      谢谢支持
    19. DLC升压电路分析与计算 25/2966 模拟电子 2022-12-21
      突然想起来,这种电路是不是和ZVS或ZCS有点像?
    20. DLC升压电路分析与计算 25/2966 模拟电子 2022-12-21
      maychang 发表于 2022-12-21 14:49 现在加入电感L1。 前面3楼我也错了。那里我说触点打到下面,电流为零时C1两端电压达到2倍VCC。有电感 ...
      不知道你们是怎么看错的,我说怎么前面的回答跟我想要的答案南辕北辙

统计信息

已有64人来访过

  • 芯积分:781
  • 好友:2
  • 主题:45
  • 回复:276

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言