stm32f103c8t6踩坑笔记(續)
0.Introduction and purpose
这个专栏是某航仪光19级著名废物曹**玩低档stm32板子的记录.估计写了也没人看.
在这个文章里面,我们的说下用stm32f103c8t6和vs2019编写STM32标准库版的程序,实现跑马灯和串口通信的过程,受硬件的限制我们只实现这两个简单功能就可以洗洗睡了.
本文涉及位运算内容,如果感觉不会/不熟练可私信交流,或者后面再开个专栏.
p.s. 如果用到基于寄存器的STM32开发,对硬件和位运算的掌握要求更高

1.Devices and tools
硬件我们用 STM32F103C8T6最小系统板.为什么用这个板子,因为航C助教工资不够入手以STM32F103ZET6最小系统为核心的多源感知综合创新系统核心板(这么长的名字,功能比最小系统板要强的多).因为没有相应的硬件资源我们只有自己造了.配件主要有CH340G USB转串口模块,自制LED灯模块,JLink调试器,jtag转swd,面包线若干.
软件我们主要用的JLink软件(jlink,jflash) VS2019 VisualGDB 硬件驱动 串口监视器

2.Hardware and software preparation
step 1:连接电路(省略若干步)直接上结果.这是个细心活.需要注意检查无误了再上电.


step 2:按照上个文章的做法新建项目,修改配置(STM32标准库 板载LED闪烁),改造项目文件

先在LEDBlink解决方案里面添加筛选器User(用于放自己写的.c .cpp和.h文件)
在User里面添加两个筛选器Inc(include,放header文件)和Src(source,放C语言和C++源代码)
然后把生成的C++文件重命名为main.cpp(因为在这个文件里写main函数)
step3.先造库吧(因为我们现在几乎什么都没有),移植下正点原子的延时库和串口库(测试串口的时候要用).新建相应的header和source文件.在header里面写类型声明和函数声明.可以用C或者C++在source里面写函数.作为曾经的航C猪脚本废物用C写的.
最终效果:

上代码辣,有bug欢迎指正:)
visualgdb需要自己造库.造好了就稍微轻松些了
(1)延时
延时可以说是stm32编程里面用的最多的一个功能了.
文件内容:
rcc时钟初始化,延时功能初始化,延时若干us,延时若干ms
常用宏定义:最大值 最小值 循环左移位CROL 循环右移位CROR
CROL宏:对n位整数X循环左移i位 如果是8位整数一定没有bug
CROR宏:对n位整数X循环右移i位
(a)delay.h
(b)delay.c 实现延时功能 RCC初始化
(2)串口函数
定义了装数据的结构变量.移植和包装了若干和串口相关的函数.可以实现波特率可修改,8位数据位,1位停止位,不带校验位的通信.用的中断法接收(要求必须遇到CRLF标识一组数组接收结束),查询法发送1字节. 在此基础上包装了把接收到的若干数据复制到指定数组和发送一个C风格字符串的功能
扩展玩法(且看后面几个文章介绍,这里先咕了):
在USART2上接HC-04蓝牙转串口模块和手机通信.可以实现手机遥控led(甚至是智能遥控小车,因为没有硬件就不做了)要求波特率9600
在USART3上连接arduino并通信.我的arduino用的是arduino nano(atmega328P芯片)主要功能是IIC转串口.据说stm32f103c8t6的硬件iic有bug会卡暴毙,软件iic事太多了我没有搞明白,因此出此下策,用arduino的wire库去实现iic通信.这样可以读取使用iic通信的传感器(例如mpu6050陀螺仪传感器)
(a)usart.h
(b)usart.c

3.LEDs Blink
用GPIO实现流水灯
上来必做两件事 初始化RCC(时钟) 初始化延时
为了做流水灯我们只需要初始化GPIO口就ok了
设置GPIOA组的A0,A1,...A7为推拉输出
用一个整数ch表示GPIOA组的7,6,5,4,3,2,1,0号io口的状态,配合GPIO_Write一次操纵一组连续的io口.循环移位实现流水灯的效果
"流水灯"视频的main.cpp代码如下,"反向流水灯"只需要把循环右移(CROR)改成循环左移(CROL)即可
delay.h参见上文


对于这个思考题,我们甚至用不上循环移位运算,只要写一个for循环并且用移位运算就ok了,如何实现这里就不展示了

4.Serial communication
把自制LED板子拔了,然后修改main.cpp代码,usart.h参见上文
打开XCOM串口监视器(也可以是别的串口软件)进行通信


后记:
感谢北航17系老师们的指导和帮助.更多的STM32踩坑文章要先咕一阵子了.
Reference:
1.北航仪光小学期实验指导书 基于 STM32 (F103ZET6)的系统实现
2.正点原子STM32F103示例代码
3.STM32单片机应用与全案例实践 沈红卫等著 电子工业出版社