01-LED控制实验
学会的知识:
首先对于一个板子,首先获得它的芯片型号,stm32,进而对Keil进行配置
其次选用合适的J-link,并且安装正确的驱动,
J-link安装好驱动之后
遇到的问题
连接不上板子,存在J-link驱动,但是没有连接到板子,检查过后发现是因为 板子接错了线
代码解读
int main(void)
{
LED_Hardware_Init(); //初始化GPIO
Delay_Init(); //延时函数的初始化
while(1)
{
LED0(1);
// Delay_ms(500);
// LED0(0);
LED1(1);
// Delay_ms(500);
// LED1(0);
LED2(1);
// Delay_ms(500);
// LED2(0);
LED3(1);
// Delay_ms(500);
// LED3(0);
}
}
对于 LED_Hardware_Init() 函数的解读,这个函数就是用来初始化GPIO接口,使之能够被调用,上拉
GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
void LED_Hardware_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOE时钟
//GPIOE2,E3,E4,E5初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3
| GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIO
}
Delay_Init 函数 延时初始化函数
void Delay_Init(void)
{
//关闭计时、不触发中断、计数时钟为AHB/8
SysTick->CTRL = 0x0;
//微秒级初值
fam_nus = SystemCoreClock/8000000;
//毫秒级初值
fam_nms = fam_nus * 1000;
//计数器清零
SysTick->VAL = 0;
/**********************************************************
功 能:微秒级延时
参 数:ctr 微秒倍数、例如 ctr = 1 则 延时1us
返回值:无
**********************************************************/
void Delay_us(uint16_t ctr)
{
uint32_t tick_flag = 0;
//定时器初值
SysTick->LOAD = ctr*fam_nus;
//计数器清零
SysTick->VAL = 0;
//开启定时器
SysTick->CTRL |= 0x01;
do
{
//获取定时器状态
tick_flag = SysTick->CTRL;
}
//状态判断
while(!(tick_flag&(1<<16)) && (tick_flag&0x01));
//关闭计时
SysTick->CTRL = 0x00;
}
/**********************************************************
功 能:毫秒级延时
参 数:ctr 微秒倍数、例如 ctr = 1 则 延时1ms
返回值:无
**********************************************************/
void Delay_ms(uint16_t ctr)
{
uint32_t tick_flag = 0;
SysTick->LOAD = ctr * fam_nms;
SysTick->VAL = 0;
SysTick->CTRL = 0x01;
do
{
tick_flag = SysTick->CTRL;
}
while(!(tick_flag & (1<<16)) && (tick_flag & 0x01));
SysTick->CTRL = 0x00;
}
/**********************************************************
功 能:延时nms
参 数:ctr 微秒倍数、例如 ctr = 1 则 延时1ms
返回值:无
**********************************************************/
void Delay_xms(uint16_t nms)
{
uint32_t temp;
SysTick->LOAD=(uint32_t)nms*fam_nms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}