XCOSnTh软件是如何结合到硬件上的?
本文从STM32F103C8T6单片机角度进行阐述。
CPU从Flash中读程序(程序的二进制放在Flash中),假如读到第一行程序的命令是:写操作0x20000000地址上的数据为0xAA,当运行完这行程序,那么0x20000000上就被写入了0xAA,其中0xAA是数据,0x20000000是地址,假如0x20000000是挂载了一个锁存器,那么这个锁存器的输出便是0xAA,那什么是锁存器?
锁存器,Latch,是数字电路中的一种具有记忆功能的逻辑元件。锁存,就是把信号暂存以维持某种电平状态,在数字电路中则可以记录二进制数字信号“0”和“1”。
只有在有锁存信号时输入的状态被保存到输出,直到下一个锁存信号。通常只有0和1两个值。
逻辑结构与功能表
8位锁存器74LS373的逻辑图如图所示。其中使能端G加入CP信号,D为数据信号。输出控制信号为0时,锁存器的数据通过三态门进行输出。
0xAA就形成了图中OUT1~8的信号,如果OUT1~8直接连接在引脚上,则0xAA就会在引脚上反应出不同的高低电平,0x20000000就相当于G这个选中信号,即只有选中了指定的电路才会在电路上形成指定的数据信号,从而完成程序对硬件的控制,即程序与硬件的具体结合。
以STM32F103的PC13IO为例子,通过寄存器(锁存器)地址+数据的方式来控制PC13的高低电平的输出,程序如下
*(unsigned int*)(0x40021000+0x18)|=1<<4;//rcc_APB2ENR:使能GPIOC端口的时钟
*(unsigned int*)(0x40011000+0x04)=0x03<<20;//gpioc_CRH:PC13配置为推完输出模式
*(unsigned int*)(0x40011000+0x0C)&=~(0x01<<13);//gpioc_pin13:PC13输出低电平:点亮LED
*(unsigned int*)(0x40011000+0x0C)|=0x01<<13;//gpioc_pin13:PC13输出高电平:LED熄灭
通过寄存器的操作如下
#include"XC_STM32F103C8T6_Register.h"//XC_R_RCC *rcc=(XC_R_RCC*)XC_RCC_BASE;XC_R_RCC *rcc=(XC_R_RCC*)0x40021000;rcc->APB2ENR|=1<<4;//使能GPIOC端口的时钟//XC_R_GPIO *gpioc=(XC_R_GPIO*)XC_GPIOC_BASE;XC_R_GPIO *gpioc=(XC_R_GPIO*)0x40011000;gpioc->CRH=0x03<<20;//PC13配置为推完输出模式
// gpioc->ODR&=~(0x01<<13);//PC13输出低电平:点亮LED;
// gpioc->ODR|=0x01<<13;//PC13输出高电平:LED熄灭
关于结构体与地址的映射关系: