描述:
我意识到我是垂死的人群中的一员,他们只使用emacs作为IDE。我决定和SystemWorkbench一起生活一段时间。很多事情需要处理,我的笔记可能会帮助你。
细节:
基于http://hackaday.com/2017/03/30/t ... uino-with-debugging上的评论,我决定让SystemWorkbench试试。
项目日志:
使用CDC USB串行接口的提示:
当你把USBCDC序列添加到你的项目中时,对于下一步该做什么你得不到太多帮助。CDC发送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;
- }
复制代码
启用半宿主printf
如果您不希望printf转到串行端口,那么您可能希望它重定向到gdb控制台(Eclipse内部)。
1。添加到链接器选项:
- -specs=rdimon.specs -lrdimon
复制代码 2。在调试配置中,找到运行命令并添加:
- monitor arm semihosting enable
复制代码 3.在main()中,提前进行此调用(在调用printf之前):
- initialise_monitor_handles();
复制代码 就是这样。现在,printf将转到您的控制台。
将printf和朋友重新定位到UART
- 确保您有足够的堆栈!如果您没有在项目生成时设置它,请在.ld文件中修复它(并确保在cubemx项目中修复它,以防重新生成。
- 另外,用IDE而不是cubemx创建一个虚拟项目。从该项目中窃取syscalls.c文件并将其放入项目中。
- 显然,你需要在cubemx设置UART。
- 添加:
- 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没有设置成你认为的那样。
笔记
- http://www.opensmt32.org/system+workbench+for+stm32
- 将cubemx从ST网站安装到Eclipse中。http://www.st.com/en/development-tools/stsw-stm32095.html
- 您必须具有用于此板的ST链接2或2-1。似乎不适用于ST链接1,即使其他工具可以处理。
- 如果你用PLL时钟的话,库贝姆有一个错误。在SystemClock_配置中,行应该如下所示:rcc_oscinitstruct.sociatortype=rcc_sociatortype_hse;
- 创建配置时,openocd的设置硬连接到项目目录中的.custom.cfg中。所以,如果你改变了任何东西,看起来你必须修改或编辑这个文件。
- 重要提示:除非您将openocd配置更改为仅使用:reset_config trst_,否则调试器将无法工作。默认值将不起作用。
- 如果将引导跳线设置为引导加载,则调试似乎可以工作。但是,您将得到引导装载程序stackpointer,它是一个非常小的堆栈,可能会覆盖您的C库数据。这将导致奇怪和不可预测的行为。
- 如果安装eGit,就可以获得Git集成。
- 如果安装tm终端,则可以在IDE中安装终端。据说它支持串行,但在Ubuntu上,RXTX配置是主机化的。我运行一个shell终端,在里面运行picocom,而不是修复它。工作良好。
原创:Al Williams
出处:http://hackaday.io/project/20879/logs
|