背景:
-
作为单片机开发,收费软件占据大部分嵌入式开发的人员的开发工具(算得上初恋工具了吧),大学教材,大学老师都是用这些收费的软件的教育版,让大部分从业人员一开始就解除的收费软件,发现这些收费软件还挺有心机的,那没有不收费的软件吗,答案是否定的,当然有,还很多,纯编译器的有GNU的GCC编译器,只是需要自己编写组织源码和工程,比较费时费力,还需要一定的编译知识,还有就是今天我要讲的基于ST生态的单片机开发STM32CubeMX和STM32CubeIDE。
-
STM32CubeMX是驱动生成软件,可以图形化配置好各个外设和时钟,然后转出STM32CubeIDE工程进行编译和调试。
-
在使用这个工具之前需求注册一个ST的账号,
https://my.st.com/cas/login?lang=en&service=https://www.st.com/content/st_com/en.html

-
注册完毕就直接下载最新的STM32CubeMX和STM32CubeIDE即可。
-
打开软件,新建工程,这里有多种开发方式,我们直接选MCU即可。我的主板用的是STM32F429ZGT6

这个界面也有st官方资料,按需取用,我创建工程就不多说了。

这样就进来配置页面了,我这里只是演示,我就配置时钟,调试口打印数据就行




注意整个时钟默认生成是25M的,我的板子设计8M的这里需要调整一下。
时钟树配置选好路径之后HCLK设置自己的目标时钟,然后回车,让工具自己算其他时钟即可,如果没有特殊要求的话。

写一下工程名字和选择一下IDE就行,如果不想用IDE想自己折腾一下工具链,也可以导出makefile,自己配置工具链编译,今天只讲IDE这里就不展开了。
其他的不懂可以先默认,导出代码



打开这个ld文件,因为的主板是有boot的,引导的地址不是0x8000000开始的,所以要调整一下

c
MEMORY
{
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
FLASH (rx) : ORIGIN = 0x8020000, LENGTH = 768K
}
改成这样即可,注意那个长度不要忘记改了。默认是整个片内的flash

c
int main(void)
{
/* USER CODE BEGIN 1 */
SCB->VTOR = 0x08020000;
/* USER CODE END 1 */
找到main函数添加向量地址,否则跑不进去。
在下面的while(1)里面增加打印函数,

c
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("hello world\r\n");
a++;
}
前面增加标准头

c
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

c
/* USER CODE BEGIN 4 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 4 */
重定向串口打印。
注意要遵循框架,用户代码一定要写在USER CODE 的BEGIN和END之间,里面定义了很多代码块,有用户头,用户指针,用户宏,用户代码块等等,下次重新配置驱动的时候不会影响用户代码。
然后build project

Run as


选择jlink



成功了。

设置断点

调试
完成