文章目录
(一)实验原理
通过控制LED上管脚输出高低电平,来实现LED闪烁。通过电路原理图,可以看出当LED的管脚输出为低电平时,LED处于一个连通的状态,因此,LED被点亮,而当LED的管脚输出高电平时,LED两边不存在电势差,就不会有电流流过,即LED被熄灭。
(二)使用寄存器地址方式完成流水灯
试验工具:keil5、STM32CubeMx 4.27、STM32F103C8、FlyMcu
1、使用STM32CubeMx生成相关代码
打开STM32CubeMx,点击new project
选择自己使用的芯片型号,这里用到的是STM32F103C8
选择作为输出的引脚,点击引脚选择GPIO_Output
设置好的引脚会变成绿色,这里选择了PB5、PB6、PB7作为流水灯的三个输出
设置SYS->Debug->Serial Wire
设置GPIO,选择Configuration->GPIO
GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。
点击生成相关代码
按下图进行相关设置
相关代码生成完成后,点击Open Project,工程文件将在keil打开
2、使用keil设置相关代码
打开main.c,找到main函数
替换while函数中的代码
while (1)
{
GPIOB->ODR &= ~(1<<5); //操作PB5,设置为高电平
GPIOB->ODR |= 1<<6; //操作PB6,设置为低电平
GPIOB->ODR |= 1<<7; //操作PB7,设置为低电平
HAL_Delay(500);//延时500毫秒
GPIOB->ODR |= 1<<5; //操作PB5,设置为低电平
GPIOB->ODR &= ~(1<<6); //操作PB6,设置为高电平
GPIOB->ODR |= 1<<7; //操作PB7,设置为低电平
HAL_Delay(500); //延时500毫秒
GPIOB->ODR |= 1<<5; //操作PF5,设置为低电平
GPIOB->ODR |= 1<<6; //操作PF6,设置为低电平
GPIOB->ODR &= ~(1<<7); //操作PF7,设置为高电平
HAL_Delay(500); //延时500毫秒
}
点击编译
编译成功,不报错
3、进行程序烧录
在进行程序烧录之前要先对硬件进行连接,按下图所示连接usb转串口工具
打开设备管理器,看见如下设备即说明连接成功
如果查看时发现设备处出现黄色感叹号,即说明未安装相关驱动
驱动链接:https://pan.baidu.com/s/1-2t09WeSUvkCXII_6SBZbw
提取码:3690
在烧录前要将ROOT0置1,ROOT1置0
打开串口烧录工具后点击搜索串口,若程序不响应,则需要手动设置端口,只要选择刚才在设备管理器看见的端口即可
按下图配置,点击读取器件信息,搜索成功即说明端口与硬件成功连接,就可以选择keil中生成的hex文件进行烧录了
出现以下结果说明程序成功烧录
接线后程序即可运行,以下就是运行效果
(三)使用HAL库方式完成流水灯
1、使用STM32CubeMx生成相关代码
方法与上面相似,只是在这里选择了三个新的输出引脚,这里选择了PA4、PA5、PA6
2、使用keil设置相关代码
方法也与上面相似,只是在这里将while函数中的代码替换成了HAL库提供的函数
由于使用HAL库进行开发,它提供了一些相关函数进行使用。(此处只说明使用的函数)
①延时函数(HAL_Delay)
函数原型: void HAL_Delay (__IO uint32_t Delay)
参数说明:Delay表示所要延时的时间大小,单位是毫秒
②写管脚函数(HAL_GPIO_WritePin)
函数原型:void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t
GPIO_Pin, GPIO_PinState PinState)
参数说明:
GPIOx: 管脚组(x的取值为A~G)
GPIO_Pin: 管脚编号(x的取值为0~15)
PinState: 管脚的状态(取值为GPIO_BIT_RESET表示0, GPIO_BIT_SET表示1)
所用代码如下
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(500); //延时500毫秒
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(500); //延时500毫秒
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_Delay(500); //延时500毫秒
}
成功编译
3、进行程序烧录
烧录过程也相似,将烧录文件选择新生成的hex文件即可
接线后程序即可运行,以下就是运行效果
(四)实现STM32的USART串口通讯程序
1、使用STM32CubeMx生成相关代码
先选择芯片,然后这设置RCC->High Speed Clock->Crystal
UEART1->Mode->asynchronous
点击configuration->USART1
设置波特率为115200,1位停止位,无校验位;
点击生成相关代码
2、使用keil设置相关代码
找到stm32f4xx_hal.c
添加stdio库,并申明串口
还是在stm32f4xx_hal.c中,重写fget和fput函数
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
在main.c中修改while函数,点击编译,成功编译
while (1)
{
printf(" Hello Windows \r\n");
HAL_Delay(1000);
}
3、进行程序烧录
烧录过程也相似,将烧录文件选择新生成的hex文件即可
打开野火串口调试助手,设置好参数后点击打开串口,成功执行
(五)利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形
打开任意工程点击魔法棒按如下设置
点击debug
选择逻辑分析仪
点击setup
设置要观察的引脚
运行程序,结果如下
总结
stm32CubeMx配合keil可以很方便的实现嵌入式编程。