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运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值