STM32串口通信
程序员文章站
2022-03-15 08:38:03
...
STM32串口通信
基于寄存器与基于固件库的stm32 LED流水灯例子的编程方式的差异
固件库,目前比较多的例程是使用固件库编写的。官方的例子也都采用固件库方式。特点就是简单,易于理解,资料多。如果你没有CortexM系列内核的开发基础,建议从固件库开始玩起。
使用寄存器,想要深入理解CortexM3内核或是需要为了获得更好的可移植性,学习寄存器编程会比较有帮助。但寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解。
学习和阅读“零死角玩转STM32F103–指南者”文档中的第20、21章内容,完成STM32的USART窗口通讯程序,要求:
1.设置波特率为115200,1位停止位,无校验位。
2.STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“。
3.当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
1.代码
main.c:
#include "stm32f10x.h"
void Delay_ms(volatile unsigned int t)
{
unsigned int i,n;
for(n=0;n<t;n++)
for(i=0;i<800;i++);
}
int main(void)
{
User_USART_GPIO_Config();
User_NVIC_Config();
User_USART_Config();
User_UART_Send_String(USART1, "abcdefg!\n");
while(1)
{
User_UART_Send_String(USART1, "hello windows!\n");
Delay_ms(5000);
}
}
中断函数:
void SysTick_Handler(void)
{
}
//中断服务函数,前面在User_USART.c void User_USART_Config(void)函数中
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了数据接收中断,所以
//将处理接收数据时的中断服务
int i=0;
uint8_t a[11];
void USART1_IRQHandler(void)
{
//uint8_t temp;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
a[i++] = USART_ReceiveData(USART1);
//USART_SendData(USART1, a[i-1]);
}
if(a[0]=='S'&&a[1]=='t'&&a[2]=='o'&&a[3]=='p'&&a[4]==','&&a[5]=='s'&&a[6]=='t'&&a[7]=='m'&&a[8]=='3'&&a[9]=='2')
while(1);
}
发送函数
void User_USART_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data)
{
//向数据寄存器写入8bit数据
pUSARTX->DR = (Data & (uint16_t)0x01FF);
//USART_GetFlagStatus检查数据是否发送完成
while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TXE) == RESET);
}
//向串口发送一个字符串数据,即可以发送包含多个字节的数据,char类型为8bit,其字符串中的每个字符都可用一个int数表示,即ASCII标准
void User_UART_Send_String(USART_TypeDef* pUSARTX, char* str)
{
unsigned int i = 0;
do
{
User_USART_Send_Byte(pUSARTX, *(str + i));
i++;
}
while(*(str+i)!='\0');
//USART_GetFlagStatus检查多个数据是否发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
2.用Flymcu把程序烧录至stm32芯片
3.用野火多功能调试助手运行
重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu和树莓派系统中分别编程,输出信息进行验证.
1 栈
通常是用于那些在编译期间就能确定存储大小的变量的存储区,用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。通常是局部变量,函数参数等的存储区。他的存储空间是连续的,两个紧密挨着定义的局部变量,他们的存储空间也是紧挨着的。
2 堆
通常是用于那些在编译期间不能确定存储大小的变量的存储区,它的存储空间是不连续的,一般由malloc(或new)函数来分配内存块,并且需要用free(delete)函数释放内存。
3 全局/静态存储区
和“栈”一样,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。
4 常量存储区
和“全局/静态存储区”一样,通常是用于那些在编译期间就能确定存储大小的常量的存储区,并且在程序运行期间,存储区内的常量是全局可见的。这是一块比较特殊的存储去,他们里面存放的是常量,不允许被修改。
5代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char g_buf[16];
char g_buf2[16];
char g_buf3[16];
char g_buf4[16];
int main()
{
printf("g_buf: 0x%x\n", g_buf);
printf("g_buf2: 0x%x\n", g_buf2);
printf("g_buf3: 0x%x\n", g_buf3);
printf("g_buf4: 0x%x\n", g_buf4);
return 0;
}
6运行结果