伙伴 stm32 交流群为您 stm32 入门提供最好的服务 QQ 群:84975845
Stm32 跑马灯实验:
首先要配置 stm32 的系统时钟
#include "stm32f10x_lib.h"
#include "sys.h"
/*白痴天才梦 stm32 开发板 完全傻瓜式的教程,手把手帮你突破嵌入式的障碍*/
/*RCC 时钟初始化函数*/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//定义错误状态类型
//重新配置 RCC 为默认值
//设置外部高速晶振
//等待外部晶振起振
if (HSEStartUpStatus == SUCCESS)
{
//判断是否起振成功
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//使能 flash 预取指缓
存
FLASH_SetLatency(FLASH_Latency_2);
//设置 flash 代码延
时周期数
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
时钟
时钟
//设置 HCLK 时钟
//设置 PCLK2
//设置 PCLK1
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//设置 PLL 时钟
源以及倍频系数
RCC_PLLCmd(ENABLE);
//使能 PLL 时
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//等待 PLL 初始化
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//设置系统 时
while (RCC_GetSYSCLKSource() != 0x08);
// 等待系统时钟设
钟
成功
钟
置成功
}
}
准备一个延时函数
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2 清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延时 nms
//注意 nms 的范围
//SysTick->LOAD 为 24 位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK 单位为 Hz,nms 单位为 ms
//对 72M 条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD 为 24bit)
SysTick->VAL =0x00;
SysTick->CTRL=0x01 ;
do
{
//清空计数器
//开始倒数
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
//关闭计数器
//清空计数器
}
//延时 nus
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00;
SysTick->CTRL=0x01 ;
do
{
//清空计数器
//开始倒数
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
//关闭计数器
//清空计数器
}
然后要配置 LED 所对应的 GPIO
void led_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//定义一个 GPIO 结构体
//使能 GPIOA 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//为 GPIO 结构体的 pin 组员
赋值为 LED 所对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//设置 GPIO 的模式
//设置 GPIO 的频率
//把 GPIOA 配置为以上配置
}
最后进入主题
/*跑马灯函数*/
void led_test(void)
{
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
//设置 GPIOA 的 PIN8
为低
delay_ms(300);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
PIN8 为高
delay_ms(300);
//延时
// 设 置 GPIOA 的
//延时
}
}
int main(void)
{
RCC_Configuration();
delay_init(72);
led_gpio_init();
led_test();
return 0;
}