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