(2)、在part number选择实验所用芯片(stm32f103c8t6),点击start project
(3)、首先点击System Core,选择SYS,Debug选择为Serial Wire
(4)、进入时钟配置,其中发现时钟有两个,HSE和LSE,流水灯实验使用GPIO接口,其中这些接口都在APB2总线里,APB2总线的时钟由HSE控制
进入Clock Configuration界面,可以观察到HSE来控制APB2总线,所以选择PLLCLK
将时钟HSE选择为Crystal/Ceramic Resonator
(5)、选择相应的引脚设置输出寄存器,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯
(6)、进入Project Manager,设置项目名称以及项目存放地址,并将IDE设置为MDK-ARM
(7)、进入 Code Generate界面,选择生成初始化.c/.h文件,后面点击Generate Code,完成项目新建
(1)、进入keil,打开项目文件,将main.c文件中的int main()函数代码替换为以下内容:
SystemClock_Config();//系统时钟初始化
MX_GPIO_Init();//gpio初始化
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
HAL_Delay(1000);//延时1s
}
(2)、接入电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
红——A5
绿——C14
黄——B9
(3)、烧录运行
(1)、Debug页面进行更改设置
(2)、进入调试界面,选择逻辑分析仪
(3)、添加要观察的引脚:
(4)、设置Grid大小为1s
(5)、运行程序观察波形图
(1)、选择stm32f103c8芯片
(2)、选择core,不选择startup
(3)、添加main.c文件
(4)、添加驱动文件
将驱动文件复制到main.c同文件夹下
右击文件夹,选择Add Existing Files to Group Source Group 1
选择All FIles,选择刚刚添加的启动文件添加
(5)、将下列代码复制至main.c文件中,并编译
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<5; //PA5低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<14; //PC14低电平
}
int main(){
int j=100;
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
// 设置 GPIO 为推挽输出
GPIOB_CRH&= 0xffffff0f; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出
GPIOC_CRH &= 0x0fffffff; //设置位 清零
GPIOC_CRH|=0x22200000; //PC14推挽输出
GPIOA_CRL &= 0xFF0FFFFF; //设置位 清零
GPIOA_CRL|=0x00200000; //PA5推挽输出
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<14);
GPIOA_ODR |= (1<<5);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
通过本次实验,我熟悉了stm32f103c8t6芯片,一些关于stm32芯片的一些相关知识,明白了通过STM32最小系统核心板GPIO端口控制LED灯,完成流水灯实验,了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
https://blog.csdn.net/weixin_46129506/article/details/120780184
http://t.csdn.cn/lDvSz