前言:

本篇讲述的是如何使用JLink向STM32F103RCT6烧写程序,同时会用滴答定时器来实现一个LED灯亮灭的程序(该程序在以后的代码里依旧会存在,主要起监控单片机是否工作以及代码是否跑飞的作用)

准备工作:

首先要准备一个下载器,这个大家可以在网上买到,如下图所示

此外,我们这里依靠的是我们上次建立的工程文档,我们这里是用的Jlink线,对SWD接口进行烧写

正篇开始:

在ARM Cortex-M3内核中有一个Systick定时器,它是一个24位的倒计数定时器,当计数到0时,它就会从Load寄存器中自动重装定时初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。Systick定时器又被称为滴答定时器(以下简称滴答)。滴答定时器的运用其实还是在于4个步骤:1、选择时钟源。2、设定重装载数。3、使能中断。4、开启滴答定时器

下面是我给大家写好的基于滴答的延时函数,大家可以直接复制使用

下面是在sysclock.c文件下,这里要注意的一点是,在stm32f10x_it.c里面也存在一个 SysTick_Handler函数,可以把他注释掉,或者直接换成我们的函数

    #include "stm32f10x.h"
    #include "sysclock.h"

    unsigned int time_delay; //这里要定义为全局变量
    /*
        SystemCoreClock / 1000      1ms中断一次
        SystemCoreClock / 1000000   1us中断一次
    */



    void delay_ms(unsigned int time_ms)
    {
        if (SysTick_Config(SystemCoreClock/1000))
        {
            while (1);
        }
        time_delay=time_ms;
        while(time_delay);
        SysTick->CTRL=0x00; 
        SysTick->VAL =0X00; 
    }

    void delay_us(unsigned int time_us)
    {
      if (SysTick_Config(SystemCoreClock/1000000))
      {
         while (1);
      }
        time_delay=time_us;
        while(time_delay);
        SysTick->CTRL=0x00; 
        SysTick->VAL =0X00; 
    }

    void SysTick_Handler(void)
    {
        if(time_delay)
        {
            time_delay--;
        }
    }

下面是sysclock.h

    #ifndef __SYSCLOCK_H
    #define __SYSCLOCK_H

    void delay_ms(unsigned int time_ms);
    void delay_us(unsigned int time_us);
    void SysTick_Handler(void);

    #endif

今天的主题是使用滴答定时器对LED灯进行操作,这里的原理图呢,我在该系列第一篇博客里提到,大家自行下载​​​​​从零开始制作STM32F103RCT6小车(一)_孙启尧的博客-CSDN博客

话不多说,直接上led灯的代码

led.c

    #include "stm32f10x.h"
    #include "led.h"

    unsigned char led_flag;//定义标志位,在滴答定时器里可以进入led闪烁的中断

    void LED_init()
    {
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_WriteBit(GPIOC, GPIO_Pin_12, Bit_SET);//先将红灯关闭,等到一切初始化完成之后再打开
        led_flag = 1;
        while(SysTick_Config(SystemCoreClock / 100));//每10ms进入一次滴答
    }

led.h

    #ifndef __LED_H
    #define __LED_H

    void LED_init(void);


    #endif

之后,我们需要在KEIL5里面配置下用Jlink烧写的必要条件

点击魔法棒,选中Debug界面之后,再点击箭头所指的Use,选中如图所示的选项

再点击setting

将方框中的内容选为SW,最后点击OK即可

为了方便大家的操作,省的每次烧录过后拔插Jlink进行重启,点击Flash Download勾选上箭头所指的内容

最后,编辑完后,点击load即可