1、准备的软件
(1)clion: 链接:https://www.jetbrains.com.cn/clion/
破解:方法可在某宝上去找。
(2)STM32CubeMX与ST_Link: 链接:https://www.st.com.cn/content/st_com/zh/stm32cubemx.html
破解:免费使用
mac电脑在安装的时候会出现上面的界面,依次安装即可。
(3)macOS的包管理器brew:打开终端输入:
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
(4)开放芯片调试器 OpenOCD:
brew install open-ocd
//输入以下命令显示版本号代表已安装成功
openocd -v
默认安装在/usr/local/Cellar/open-ocd/
(5)交叉编译工具链arm-none-eabi-gcc:
brew install --cask gcc-arm-embedded
以下命令显示版本号说明安装成功
arm-none-eabi-gcc -v
arm-none-eabi-gdb -v
(6)建议装个MAC软件商店的XCode。
2、配置CLion
打开Clion中的设置
选择在构建、执行、部署选项中查看工具链的设置。一般情况下,CLion会在默认中自动配置好环境,找的到C和C++的编译器。
我在这里直接寻找到C和C++的编译器所在的位置。
与window系统不同的是,这里不需要进行MinGW环境的配置。
然后再CMake栏下确认一下工具链是否正确:
至此CLion环境配置完成,可以创建STM32项目了。
3、在CLion中创建STM32工程
(1)创建CLion工程
打开CLion,点击新建项目,会出现以下界面。
选择stm32cunbemax,在桌面上新建个文件夹demo,之后所有的工程文件都保存在此文件夹中。
点击创建,demo文件中会生成一个.ioc文件,点击.ioc文件,会出现如下内容。
双击通过图中箭头所指的(通过说stm32cubemx),系统会自动打开stm32cubemx这个程序。
这里默认选中的芯片型号是STM32F030F4Px,可以在CubeMX中重新选择自己需要的芯片,一切操作都和使用Keil开发没有区别。
选择stm32f103c8t6芯片,可通过图形化界面配置所需的功能。本文配置引脚PC13输出以及串口1。
stm32f103c8t6的时钟树的配置如下:
最需注意的是,就是在下面的设置中项目名称一定要和在CLion中建立的一致,这样生成的工程文件才会覆盖Clion中的文件,否则会另外生成一个文件夹,Clion就无法读取了。
每次修改完点软件右上角的Generate之后,会自动出现弹窗,选择yes
之后会出现以下弹窗:
弹窗直接点Close,Clion里面会自动更新文件。
打开后台运行的CLion,开始的界面里会出现一个配置文件的小窗口
选择配置文件中stm32f1,之后点击复制到项目并使用。
Cmake会自动编译工程,在CLion底栏的CMake选项卡中如果没有提示错误,说明工程配置就没问题了
若CMake没有自动编译,且CLion底栏的CMake选项卡没有任何消息,左侧文件里没有出现camke-bulid-debug。将CLion重启,可能解决此问题。
顶栏右部的这三个图标分别是编译、下载、调试:
点击编译,CLion底栏的消息选项卡可以看到编译输出。
4、烧录程序 & 在线调试
在左侧文件夹里打开stm32f103c8_blue_pill.cfg文件,将里面的内容替换为
source [find interface/stlink.cfg]
transport select hla_swd
source [find target/stm32f1x.cfg]
adapter speed 10000
之后选择编辑配置
在弹出的界面添加新配置,选择OpenOCD
在OpenOCD配置文件中,可执行的二进制文件,选择Cmake编译后的二进制文件;面板文件选择,demo文件夹里的stm32f103c8_blue_pill.cfg文件。配置结果如下所示:
设置好配置文件之后,就可以点击下载或者调试按钮进行下载和在线调试了。
最后说明一下,CLion中组织编译规则都是基于CMakeLists.txt文件的,若要再新建的文件夹添加.c和.h文件,那么在CMakeLists.txt文件里面添加源码目录和include文件夹的路径就行了:
5、其他问题
printf重定向问题
在Keil里面为了使用printf函数我们需要重定向fputc函数:
int fputc (int ch, FILE *f)
{(void)HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);return ch;
}
其中的FILE定义在stdio.h头文件中,所以需要在项目中包含这个头文件,但是经过测试发现,Keil里面包含的是MDK\ARM\ARMCC\include这个目录下的stdio.h,而在Clion中是不会链接到这个文件的。因此如果在Clion中也按之前的方法进行重定向,会发现printf没有任何输出。
在Clion中链接的是/ Applications/ ArmGNUToolchain/ 13.3.rel1/ arm-none-eabi/ arm-none-eabi/ include/ stdio. h里面的stdio.h,如果仍然想使用printf函数功能,则需要在文件usart.c添加如下程序:
//redirect _read to huart1,necessary for scanf、getchar
int _read(int file, char *ptr, int len)
{/* receive data from serial huart1 */HAL_UART_Receive(&huart1, ptr, len,1000);return (len);
}//redirect _write to huart1,necessary for printf
int _write(int file, char *ptr, int len)
{/* send data to serial huart1 */HAL_UART_Transmit(&huart1, ptr, len, 1000);return len;
}
但值得注意的是只能使用printf函数来输出串口数据,但scanf函数在stm32f103c8t6中运行还是有问题,会出现FLASH文件过大报错,之后我会继续找解决办法。