基于ST生态的正版单片机开发-创建第一个程序并调试

背景:

  • 作为单片机开发,收费软件占据大部分嵌入式开发的人员的开发工具(算得上初恋工具了吧),大学教材,大学老师都是用这些收费的软件的教育版,让大部分从业人员一开始就解除的收费软件,发现这些收费软件还挺有心机的,那没有不收费的软件吗,答案是否定的,当然有,还很多,纯编译器的有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

成功了。

设置断点

调试

完成