• KEIL查看寄存器调试技巧__及其ST-LINK 烧写报错"no target connected"解决方案


    ST-LINK 烧写报错"no target connected"

    STM32调试器配置异常导致的问题与解决方法(一)

    原因:我把PA、PE相关的寄存器值写错了

    **复制粘贴时没注意,写少了取反符号**
    错误代码

        //MODE:输入
        GPIOA->MODER &= (0x3 << (2*0)); //清零
        GPIOE->MODER &= (0x3 << (2*2))|(0x3 << (2*3))|(0x3 << (2*4));
    

    这样导致了其他位被置为0了,而需要更改的位却没有更改

    这里刚好把 SWDIO 端口占用了,导致发现不了设备
    image
    错误代码导致的结果
    image
    image

    SWDIO所需端口被修改了模式,导致用不了SW协议

    正确代码

        //MODE:输入
        GPIOA->MODER &= ~(0x3 << (2*0)); //清零
        GPIOE->MODER &= ~(0x3 << (2*2))|(0x3 << (2*3))|(0x3 << (2*4));
    

    这样才是把需要的位置0

    解决方法:

    改为“连接调试烧写器时就复位
    image
    然后烧写正常的代码试试,可以的话再把原来的代码改正后烧写。

    改成这样的副作用:接上就直接复位了

    Keil 查看片上外设寄存器技巧

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

    image

    效果图如下
    GPIOA的MODER寄存器
    image
    GPIOA的IDR寄存器,这里能显示每一个关键位置的0和1
    image
    GPIOA的AF寄存器,这里非常简洁地看到 端口1到3 的值为 0x01,即开启复用 AF1
    image

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

    可见,这让我们能快速找出寄存器值的关键位是否正确,而不必查看整个寄存器的值并手动计算每个位的数值

    开发环境优化

    建议编辑项目代码和编译烧写用 VSCode 搭配C/C++ 插件和 keil assistant 插件
    调试用 KEIL (如上面的 System Viewer)
    image

    注意:当然,添加新文件到Keil项目还是需要在Keil里面添加,然后再Keil编译一下保存。

    内联函数

    需要注意的地方有:
    image

    image

    不同编译器的定义
    image

    也就是:用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

    image

    TIM的arr寄存器

    这个寄存器不能一直写入,不然在裸机里程序实时度高,PWM接上LED灯后肉眼根本看不到灯光变化

    STM32 手册说明

    STM32 是 ST 公司出品的基于 ARM 内核的处理器。
    ARM 内核是 ARM 公司的内核。
    关系:ST 购买 ARM 授权,然后 ARM 公司授权给 ST 基于 ARM 内核定制自己的处理器的商业权力

    架构图如下:
    image

    其中 ARM Cortex-M4 是 ARM 内核部分,其他部分都是 ST 公司的定制部分

    1. F4xx系列参考手册(适用于整个F4xx系列,ST公司出品)
      image

    image

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

    image

    1. CM 内核权威手册(ARM 公司出品)
      书名:《The Definitive Guide to ARM® Cortex®-M3 and Cortex-M4 Processors》Third Edition
      作者:Joseph Yiu
      公司:ARM Ltd., Cambridge, UK

    例如:NVIC中断属于ARM内核,所以应该在这里查阅,而非 ST 手册

    image

    --------蓝天上的云_转载请注明出处.
  • 相关阅读:
    CSS:关于CSS Hack
    JS数据交互:动态从数据库中获取数据填充Select
    Oracle数据库—— 事务处理与并发控制
    Java 实现任意N阶幻方的构造
    Java 实现奇数阶幻方的构造
    Web前端开发笔试&面试_03
    任意多边形的几何变换
    关于网站劫持
    mysql 出现Host 'localhost' is not allowed to connect to this MySQL server 错误
    mysql 导入表数据中文乱码
  • 原文地址:https://www.cnblogs.com/yucloud/p/ST_LINK_no_target_connected.html
Copyright © 2020-2023  润新知