目录
器材
单片机:stm32f103C8T6
TTL转接口
三个红黄绿LED发光二极管
若干杜邦线
KeilMDK软件
单片机下载软件mcuisp
使用引脚:A1,B1,B10
一、使用寄存器方式点亮流水灯
1、KeilMDK工程创建
(1)Project->New μVision Project
(2)设置文件名(liushui1)
(3) 选择使用的单片机(stm32F103C8)
(4) CMSIS->CORE,Device->Starup
2、.c文件
#include "stm32f10x.h"
void delay_ms(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i = 10000;
while(i--);
}
}
int main(void)
{
//时钟使能A,B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//配置
GPIO_InitTypeDef led_initA1;
led_initA1.GPIO_Pin = GPIO_Pin_1;
led_initA1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initA1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB1;
led_initB1.GPIO_Pin = GPIO_Pin_1;
led_initB1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB10;
led_initB10.GPIO_Pin = GPIO_Pin_10;
led_initB10.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB10.GPIO_Speed = GPIO_Speed_10MHz;
//初始化
GPIO_Init(GPIOA, &led_initA1);
GPIO_Init(GPIOB, &led_initB1);
GPIO_Init(GPIOB, &led_initB10);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
delay_ms(1000);
}
}
3、运行效果
二、使用标准库方式点亮流水灯
1、KeilMDK工程创建
(1)Project->New μVision Project
(2)设置文件名(liushui1)
(3) 选择使用的单片机(stm32F103C8)
(4)直接选择ok
(5) 在文件夹中建立user,lib,core,obj文件夹,并删除原有地LIsting和Objects文件夹
(6)获取库函数文件
官网获取地址:STSW-STM32054 - STM32F10x标准外设库 - 意法半导体STMicroelectronics
(7)在库函数中拷贝相关文件到对应文件夹下
core文件夹:
lib文件夹:
user文件夹:
(8)将其在keil中导入项目中
最后效果
2、项目配置
(1)OutPut路径配置:选择自己建的obj文件,勾选生成hex文件
(2) 配置全局宏定义变量
3、.c文件
最后,需要将main.c中的代码都删掉,写你自己的代码
#include "stm32f10x.h"
void delay_ms(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i = 10000;
while(i--);
}
}
int main(void)
{
//时钟使能A,B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//配置
GPIO_InitTypeDef led_initA1;
led_initA1.GPIO_Pin = GPIO_Pin_1;
led_initA1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initA1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB1;
led_initB1.GPIO_Pin = GPIO_Pin_1;
led_initB1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB10;
led_initB10.GPIO_Pin = GPIO_Pin_10;
led_initB10.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB10.GPIO_Speed = GPIO_Speed_10MHz;
//初始化
GPIO_Init(GPIOA, &led_initA1);
GPIO_Init(GPIOB, &led_initB1);
GPIO_Init(GPIOB, &led_initB10);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
delay_ms(1000);
}
}
4、运行效果
三、亮灭准确周期
1.设置options for target:
2.设置Debug
3.设置检测引脚
4.波形图
可以看出循环一周下来时间大约是2.5s。
而延迟函数调整的实际时间是0.84s左右。