欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32串口通信

程序员文章站 2022-03-15 08:38:03
...

基于寄存器与基于固件库的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芯片
STM32串口通信
3.用野火多功能调试助手运行
STM32串口通信

重温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运行结果
STM32串口通信

相关标签: 我的学习 stm32