2021/10/11 智能家具 嵌入式实训 第一天 建立工程文件+烧录

 

实训目标:

 

 

 使用的芯片介绍

STM32F103ZET6

 

查询该芯片?

 

 

 

 

 

 

 

 

 

 

(1)        内核:ARM 32位的cortex-M3 CPU

(2)        最大工作频率:72MHZ 存储:256-512K

Flash;

SRAM;

Debug模式:SWD/JTAD接口

左上角:内核以及下载接口

双向箭头:数据总线

 

STM产品命名规则

 

 

 led 灯例程序

建立模板工程文件

ü  新建文件夹

 

 

 

 ü  复制相关文件:

启动代码:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

 

 

 拷贝到startup中

 

 

 

ü   STM32底层时钟配置代码:

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x   system_stm32f10x.c/h

 

 

 

 ü  stm3210xh-STM32底层所有的寄存器结构体、宏定义e

 

 

 

ü  中断相关代码:stm32f10x_it.c/.h

 

      STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

 

 

 stm32f10x_conf.h -- 不需要复制(后续库函数版本使用)

复制到

 

 

 

最终:

 

 

 

 

 

 

 

 

 

 建立工程

 

 ü  新建工程:

     双击打开Keil软件:找到Project下的新建工程

       选择保存的位置,工程命名;

       选择芯片:STM32F103ZE

     选择M3内核底层代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 运行环境搭建:

 

 

 

 

文件夹分类:

 

 

 

 

 

 

 

 

 

 ü  往工程中添加文件:

 

 

 

 

 

 

 

 ü  添加其他文件,.h不用添加,编译后自动包含。

 

 

 

 

 

 

 

 

 ü  包含头文件路径:

 

 

 

 

 

 

 

 

 

 

 

 USE_STDPERIPH_DRIVER,STM32F10X_MD

 

 

 

 

ü  新建main.c main.h

 

 

 

 

 

#include "main.h"

int main(void)
{
  LED_Config(ON);
	while(1);
}

 main.h

#ifndef _MAIN_H
#define _MAIN_H


#include "led.h"

#endif

  

把api加上自己做的延时函数和led代码

delay.c

#include "delay.h"

/***********************************************************************************
函数功能: DELAY 函数接口
作者:XYD_ZH
时间:2021年9月7日15:50:32
***********************************************************************************/
//1. 延时1us
void Delay_nop_1us(void)
{
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    __NOP();__NOP();
}
//2. 延时nus
void Delay_nop_nus(u32 time)
{
    while(time--)
    {
        Delay_nop_1us();
    }
}
//3. 延时nms
void Delay_nop_nms(u32 time)
{
    while(time--)
    {
        Delay_nop_nus(1000);
    }
}
View Code

led.c

#include "led.h"

/***********************************************************************************
函数功能: LED初始化
形参:condition -- 初始状态(ON、OFF)
返回值:无
作者:XYD_ZH
时间:2021年9月7日16:22:52
***********************************************************************************/
/*
    管脚:
    LED1    PE2
    LED2    PE3
    LED3    PE4
    LED4    PE5
*/
void LED_Config(int condition)  
{
    #if 1
        /* 寄存器法 */
        // 1.时钟使能 -- GPIOE端口时钟
        RCC->APB2ENR |= (0x1<<6);
        // 2.模式配置(通用推挽输出)
        GPIOE->CRL &= ~(0xFFFF<<8); //清零 -- [23:8]位
        GPIOE->CRL |= (0x3333<<8);  //置位            
        // 3.初始状态
        if(condition == OFF)
            GPIOE->ODR |= (0xF<<2);
        else
            GPIOE->ODR &= ~(0xF<<2);          
    #else
        /* 库函数法 */
        //1.时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
        //2.模式配置
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        //3.初始状态
        if(condition == OFF){
            GPIO_SetBits(GPIOE,GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
        }
        else{
            GPIO_ResetBits(GPIOE,GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
        }
    #endif
    
}
/***********************************************************************************
函数功能: LED 函数接口
作者:XYD_ZH
时间:2021年9月7日16:22:52
***********************************************************************************/
/*
* 呼吸灯(模拟PWM波)
*/ 
void LED_Breath(void)
{    
    int i = 0;
    for(i=0;i<1000;i++)         //逐渐变亮
    {
        LED1(ON);LED2(ON);LED3(ON);LED4(ON);
        Delay_nop_nus(i);
        LED1(OFF);LED2(OFF);LED3(OFF);LED4(OFF);
        Delay_nop_nus(1000-i);
    }    
    for(i=0;i<1000;i++)         //逐渐变暗
    {
        LED1(OFF);LED2(OFF);LED3(OFF);LED4(OFF);
        Delay_nop_nus(i);
        LED1(ON);LED2(ON);LED3(ON);LED4(ON);
        Delay_nop_nus(1000-i);
    }
}
/*
* LED闪烁
*/
void LED_Twinkle(void)
{
    Delay_nop_nms(500);
    LED1_TOGGLE;LED2_TOGGLE;LED3_TOGGLE;LED4_TOGGLE;
}
View Code

 

编译

 

 

ü  配置工程:

 

 

 

 

 

 

 

 

 

 

 

 

 最后生成object-hex文件

hex文件就是编译烧录程序的文件

测试:同理添加如下两个文件到API文件下:

 

 

 

并将.c添加到工程中/.h路径配置进来;

编译,没有问题,填写主函数,编译下载即OK;

 

如何通过串口下载程序

  • 安装驱动:CH340驱动
  • 打开下载软件:FlyMCU
  • 通过FlyMCU可执行Hex文件下载到板子上运行;

下载配置

 

 

 

 

关于时钟设定

如果我现在采用12MHz晶振,程序如何修改?

 

如果输入的12MHz晶振,修改倍频RCC_CFGR_PLLMULL9RCC_CFGR_PLLMULL6

 

 

另外,需将外部高速时钟宏定义改为12MHZ

 

模板代码:

https://wwa.lanzoui.com/i2AKBv8k4eh

 

综上就是第一天实训内容

 

参考:

推荐b站视频:

https://www.bilibili.com/video/BV1kx411k7JT?from=search&seid=7385994860656345211&spm_id_from=333.337.0.0

正点原子

【挽救小白第一季】STM32+8266小程序智能家居毕设实战:

https://www.bilibili.com/video/BV1ae411W7yD?p=2

posted @ 2021-10-12 07:34  halfup  阅读(272)  评论(0编辑  收藏  举报