ST-LINK 烧写报错"no target connected"
原因:我把PA、PE相关的寄存器值写错了
**复制粘贴时没注意,写少了取反符号**
错误代码
//MODE:输入
GPIOA->MODER &= (0x3 << (2*0)); //清零
GPIOE->MODER &= (0x3 << (2*2))|(0x3 << (2*3))|(0x3 << (2*4));
这样导致了其他位被置为0了,而需要更改的位却没有更改
这里刚好把 SWDIO 端口占用了,导致发现不了设备

错误代码导致的结果


SWDIO所需端口被修改了模式,导致用不了SW协议
正确代码
//MODE:输入
GPIOA->MODER &= ~(0x3 << (2*0)); //清零
GPIOE->MODER &= ~(0x3 << (2*2))|(0x3 << (2*3))|(0x3 << (2*4));
这样才是把需要的位置0
解决方法:
改为“连接调试烧写器时就复位

然后烧写正常的代码试试,可以的话再把原来的代码改正后烧写。
改成这样的副作用:接上就直接复位了
Keil 查看片上外设寄存器技巧
正常编译烧写后,在 Debug 调试模式下

点击Debug菜单里的 Start/Stop Debug Session 即可开启 Debug 调试模式,然后点击 Peripherals菜单里的 System Viewer 系统视图即可选择某个外设的寄存器视图

效果图如下
GPIOA的MODER寄存器

GPIOA的IDR寄存器,这里能显示每一个关键位置的0和1

GPIOA的AF寄存器,这里非常简洁地看到 端口1到3 的值为 0x01,即开启复用 AF1

TIM2定时器的寄存器值,如CCR1的高低位,CCR2的高低位,

可见,这让我们能快速找出寄存器值的关键位是否正确,而不必查看整个寄存器的值并手动计算每个位的数值
开发环境优化
建议编辑项目代码和编译烧写用 VSCode 搭配C/C++ 插件和 keil assistant 插件
调试用 KEIL (如上面的 System Viewer)

注意:当然,添加新文件到Keil项目还是需要在Keil里面添加,然后再Keil编译一下保存。
内联函数
需要注意的地方有:


不同编译器的定义

也就是:用C99,debug模式不优化代码不内联
我的用法,一般是在寄存器操作的地方写,因为涉及寄存器操作的要快,并且我也不想要堆栈开销 ,在头文件里这么写:
// led_color.h
#ifndef LED_COLOR_H__
#define LED_COLOR_H__
#include "stm32f4xx.h"
//注意以下这个内联
__INLINE void led_color_change(u16 r, u16 g, u16 b) {
TIM_TypeDef * TIMx=TIM2;
TIMx->CCR2 = r;
TIMx->CCR3 = g;
TIMx->CCR4 = b;
}
#endif
// main.c
#include "stm32f4xx.h"
#include "led_color.h"
extern __INLINE void led_color_change(u16 r, u16 g, u16 b); //注意这行
int main(void) {
while(1)
{
led_color_change(2,45,239);
}
}
详见 C99/C11 的inline
https://zh.cppreference.com/w/c/language/inline

TIM的arr寄存器
这个寄存器不能一直写入,不然在裸机里程序实时度高,PWM接上LED灯后肉眼根本看不到灯光变化
STM32 手册说明
STM32 是 ST 公司出品的基于 ARM 内核的处理器。
ARM 内核是 ARM 公司的内核。
关系:ST 购买 ARM 授权,然后 ARM 公司授权给 ST 基于 ARM 内核定制自己的处理器的商业权力
架构图如下:

其中 ARM Cortex-M4 是 ARM 内核部分,其他部分都是 ST 公司的定制部分
- F4xx系列参考手册(适用于整个F4xx系列,ST公司出品)


- F407 具体芯片手册(对
F4xx系列手册的具体芯片补充说明,ST公司出品)


- CM 内核权威手册(ARM 公司出品)
书名:《The Definitive Guide to ARM® Cortex®-M3 and Cortex-M4 Processors》Third Edition
作者:Joseph Yiu
公司:ARM Ltd., Cambridge, UK
例如:NVIC中断属于ARM内核,所以应该在这里查阅,而非 ST 手册
