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 手册