百问网七天物联网家居Day2

1、STM32F103C8T6最小系统:最少的电路组成单片机可以工作的系统

        电源电路、时钟电路、复位电路、调试下载电路、启动选择电路

2、存储结构:0x0000 0000 – 0xFFFF FFFF 一共4GB

0x0800 0000 – 0x0801 FFFF是flash,存放下载的代码

0x2000 0000是SRAM内存,代码运行过程中所产生的临时数据变量

0x4000 0000 是外设

0xE000 0000 – 0xE010 0000是M3内部外设寄存器地址,比如中断向量表,系统的滴答时钟等

3、开发方式:

  • 汇编操作寄存器:执行效率高,编写难度大、移植性差

        代码如下:实现功能:开发板上的LED间隔1s闪烁

MainLoop

; 设置GPIOA_1输出高电平

LDR R0, =(0x40010800 + 0xC)  ; GPIOA_ODR

LDR R1, [R0]

ORR R1, R1, #(1<<1)

STR R1, [R0]

BL Delay



; 设置GPIOA_1输出低电平

LDR R0, =(0x40010800 + 0xC)  ; GPIOA_ODR

LDR R1, [R0]

BIC R1, R1, #(1<<1)

STR R1, [R0]

BL Delay

B MainLoop
  • 使用C语言操作编写寄存器:执行效率适中,编写效率低,移植性差
//定义各个寄存器

#define RCC_APB2ENR  (0x40021000 + 0x18)

#define GPIOA_BASE   (0x40010800)

#define GPIOA_CRL    (GPIOA_BASE + 0)

#define GPIOA_ODR    (GPIOA_BASE + 0X0c)



void delay(volatile long i)

{

while (i--);

}



int main(void)

{

volatile unsigned int *pRccApb2Enr;

volatile unsigned int *pGpioaCrl;

volatile unsigned int *pGpioaOdr;



pRccApb2Enr = (volatile unsigned int *)RCC_APB2ENR;

pGpioaCrl   = (volatile unsigned int *)GPIOA_CRL;

pGpioaOdr   = (volatile unsigned int *)GPIOA_ODR;



/* 1. 使能GPIOA的时钟

 * GPIO是挂载在APB2上的,所以我们要使能APB2的外设时钟使能位

 * 从RCC_APB2ENR寄存器描述中我们可以看到APB2ENR[8:2]是GPIO[G:A]时钟的控制位,控制GPIO时钟是失能或者使能

 * 开发板上的LED的GPIO组是使用的GPIOA,即要使能APB2ENR[2]位,为其赋值“1”即可打开GPIOA的时钟 */

*pRccApb2Enr |= (1<<2);



/* 2. 设置GPIO为输出功能:

 * MODE_0=1,PB0输出模式,输出速率最大10MHz

 */

///操作寄存器的地址

*pGpioaCrl |= (1<<4);



while (1)

{

    *pGpioaOdr |= (1<<1);

        delay(1000000);

    *pGpioaOdr &= ~(1<<1);

        delay(1000000);

}

}

以上两种开发方式适合任何芯片,阅读数据手册找到对应的寄存器,通过指针变量的方式操作寄存器。

  • 使用标准库开发:执行效率稍低,编写效率高,移植性稍低。ST公司最早发布的固件库,对STM32芯片进行了完整的封装,包含所有的外设性能特性,每个外设驱动都由一组函数组成,这组函数可以覆盖该外设的所有功能。但标准库只针对某一系列的stm32芯片,移植性差。
#include "main.h"

#include "stm32f10x.h"

#include "driver_led.h"



void delay(volatile long i)

{

while (i--);

}



int main(void)

{   



    // 初始化LED

    LedGpioInit();

   

    // 点亮LED灯

while(1)

{

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);

        delay(1000000);

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);

        delay(1000000);

}

}

在LedGpioInit()中定义结构体变量,使能相应的时钟,配置引脚参数,初始化引脚配置。

  • 使用HAL库开发:执行效率稍低,编写效率高,移植性好。

HAL库支持STM32全系产品,相比于标准库,HAL库具有更的抽象整合水平,可以轻松实现一个STM32产品移植到另一个不同系列的STM32产品上。

#include "main.h"

#include "driver_led.h"



int main(void)

{   

    // 初始化HAL库函数必须要调用此函数

    HAL_Init();

    // 系统时钟即AHB/APB时钟配置

    SystemClock_Config();

   

    // 初始化LED

    LedGpioInit();

   

    // 点亮LED灯

       while(1)

       {

              HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);

              HAL_Delay(1000);

              HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

              HAL_Delay(1000);

       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值