本帖最后由 丿灬幸灬 于 2018-11-5 10:24 编辑
描述
我意识到我只是将emacs作为IDE使用的人群中的一员。我决定用SystemWorkbench一段时间。有很多事情需要处理,我的笔记可能会对你有所帮助。
细节
基于对之前的评论,我决定使用SystemWorkbench。
使用CDC USB串行口的提示
当您将USB CDC串行总线添加到您的项目中,您不会得到关于下一步做什么的帮助。CDC_Transmit_FS调用非常明显。给它一个消息和一个长度,它就会发送它。很好。
不过是通过名为CDC_Receive_FS的回调函数接收。你不会把它叫做。框架为您调用它。
这是我的版本:
- static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
- {
- /* USER CODE BEGIN 6 */
- uint32_t len=*Len;
- if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED)
- {
- return USBD_FAIL;
- }
- if (((Buf == NULL) || (Len == NULL)) || (*Len <= 0))
- {
- return USBD_FAIL;
- }
- /* Get data */
- uint8_t result = USBD_OK;
- do
- {
- result = USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
- }
- while(result != USBD_OK);
- do
- {
- result = USBD_CDC_ReceivePacket(&hUsbDeviceFS);
- }
- while(result != USBD_OK);
- // add data to FIFO
- while (len--)
- if (FIFO_INCR(RX_FIFO.head)==RX_FIFO.tail)
- return USBD_FAIL; // overrun
- else
- {
- RX_FIFO.data[RX_FIFO.head]=*Buf++;
- RX_FIFO.head=FIFO_INCR(RX_FIFO.head);
- }
- return (USBD_OK);
- /* USER CODE END 6 */
- }
复制代码
这是其中一个头文件:
- #define FIFO_SIZE 32 // must be 2^N
- #define FIFO_INCR(x) (((x)+1)&((FIFO_SIZE)-1))
- /* Structure of FIFO*/
- typedef struct FIFO
- {
- uint32_t head;
- uint32_t tail;
- uint8_t data[FIFO_SIZE];
- } FIFO;
- extern FIFO RX_FIFO;
复制代码
然后你也需要一种方法把它读出来
- /* Create FIFO*/
- FIFO RX_FIFO = {.head=0, .tail=0};
- // returns bytes read (could be zero)
- // would be easy to make it end early on a stop char (e.g., \r or \n)
- uint8_t VCP_read(uint8_t* Buf, uint32_t Len)
- {
- uint32_t count=0;
- /* Check inputs */
- if ((Buf == NULL) || (Len == 0))
- {
- return 0;
- }
- while (Len--)
- {
- if (RX_FIFO.head==RX_FIFO.tail) return count;
- count++;
- *Buf++=RX_FIFO.data[RX_FIFO.tail];
- RX_FIFO.tail=FIFO_INCR(RX_FIFO.tail);
- }
- return count;
- }
复制代码
使Semihosted Printf
如果您不希望printf转到串行端口,那么您可能希望将它重定向到gdb控制台(在Eclipse内部)。
1、添加到链接器选项:
- -specs=rdimon.specs -lrdimon
复制代码
2、在调试配置中,找到运行命令并添加:
- monitor arm semihosting enable
复制代码
3、在你的main()中,提前(在调用printf之前)进行此调用:
- initialise_monitor_handles();
复制代码 就是这样。现在printf将转到控制台。
重新目标Printf到UART
1、确保你有足够的堆栈!如果您没有在项目生成时设置它,请将其修复到.ld文件中(并确保也将其修复到CubeMX项目中,以防重新生成。
2、另外,使用IDE而不是CubeMX创建一个虚拟项目。偷的系统调用。c文件从那个项目,并把它放在你的项目。
3、显然,您需要在CubeMX中设置UART。
4、添加:
- int __io_putchar(int ch)
- {
- uint8_t ch8=ch;
- HAL_UART_Transmit(&huart1,(uint8_t *)&ch8,1,HAL_MAX_DELAY);
- return ch;
- }
- int __io_getchar()
- {
- uint8_t ch8;
- HAL_UART_Receive(&huart1,&ch8,1,HAL_MAX_DELAY);
- return 0;
- }
复制代码 完成了!神秘的崩溃意味着你的堆栈太小,或者你的启动跳投设置有问题,SP没有设置成你认为的那样。
笔记
1、STM32系统工作台
2、从ST网站安装CubeMX到Eclipse。
3、这块黑板必须有ST-Link 2或2-1。尽管其他工具可以处理,但ST-Link 1似乎无法工作。
4、如果使用PLL时钟,CubeMX有一个错误。在SystemClock_Config中,代码行应该是这样的:RCC_OscInitStruct。OscillatorType = RCC_OSCILLATORTYPE_HSE;
5、OpenOCD的设置是硬连接到.custom中的。当您创建配置时,cfg在您的项目目录中。所以如果你改变了什么,看起来你必须删除或编辑那个文件。
6、重要提示:除非您更改openOCD配置以使用:reset_config trst_only,否则调试器将无法工作。默认值不会工作。
7、如果为引导加载设置了引导跳线,调试就会正常工作。但是,您将得到引导装载程序堆栈指针,它是一个非常小的堆栈,可能会覆盖您的C库数据。这会导致奇怪和不可预知的行为。
8、如果您安装了eGit,就会得到Git集成。
9、如果您安装了TM终端,您可以在IDE中有一个终端。它应该支持串行,但在Ubuntu上,RXTX配置被处理。我没有修复它,而是运行一个shell终端并在其中运行picocom。工作很好。
原文请见hackaday
|
能不能麻烦您不要发布不带来源链接的机器翻译文章了?这既是对读者的不尊重,也是对作者著作权的侵犯。版主是不是可以警告此人?