stm32f10x串口实验之中断模式

1、在使用一个内置外设的时候,我们首先要使能相应的 GPIO 时钟,然后使能复用功能时

钟和内置外设时钟。注意设置时,要使能三个,一个gpio,一个usart,还有一个复用功能;

2、gpio的端口模式设定:

3、中断相应函数的名字是不能随便定义的,一般我们都遵循 MDK

定义的函数名。这些函数名字在启动文件 startup_stm32f10x_hd.s 文件中可以找到

4、串口设置的一般步骤可以总结为如下几个步骤:

1) 串口时钟使能, GPIO 时钟使能

2) 串口复位   一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作(DeInit(函数))

3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

6) 使能串口

7) 编写中断处理函数

5、STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是

一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收

到数据的时候,也是存在该寄存器内。

6、串口的状态可以通过状态寄存器 USART_SR 读取。通过读(即为receive函数) USART_DR 可以将

该位清零,也可以向该位写 0,直接清除。

7、因为我们使用到了串口的中断接收,必须在 usart.h 里面设置

EN_USART1_RX 为 1(默认设置就是 1 的) 。该函数才会配置中断使能,以及开启串口 1 的

NVIC 中断。这里我们把串口 1 中断放在组 2,优先级设置为组 2 里面的最低。NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设 置 NVIC 中 断 分 组 2

8、 IO 口复用的,信号在逻辑分析窗口是不能显示出来的(看不到波形),

自己实现的代码如下:

m_usart.c文件:

#include "m_usart.h"
#include "sys.h"

void GPIO_config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO ,ENABLE);

	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

}

void NVIC_config()
{
	NVIC_InitTypeDef NVIC_InitStruct;

	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
}

void USART_config()
{
	USART_InitTypeDef USART_InitStruct;
	USART_DeInit(USART1);

	USART_InitStruct.USART_BaudRate = 115200;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No ;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
	USART_Init(USART1,&USART_InitStruct);

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //Dê1ü£
	USART_Cmd(USART1,ENABLE);  //′úê1ü£

}

void init_usart1(void)
{
	GPIO_config();
	NVIC_config();
	USART_config();

}

主函数中的中断服务程序:

void USART1_IRQHandler(void)

{

if((USART_GetITStatus(USART1, USART_IT_RXNE) != RESET))  //判断中断状态;

{

if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)     //注意,这里是判断串口状态;

{

r_data = USART_ReceiveData(USART1);

USART_SendData(USART1,r_data);

}

}

USART_ClearITPendingBit(USART1,USART_IT_RXNE);     //清除中断标志位;

}

好了,今天收获不是很多,好好的,第二天加油!

弟子规第二天:

父母呼 应勿缓 父母命 行勿懒

  父母教 须敬听 父母责 须顺承

  冬则温 夏则凊 晨则省 昏则定

  出必告 反必面 居有常 业无变

百事孝为先!

必须孝敬父母,尊重长辈,与君共勉!

今天我也进行了爱心捐款,我做了一件好事,自己的正能量满满,加油,我会越来越好的!

加油!

时间: 2024-10-01 07:31:58

stm32f10x串口实验之中断模式的相关文章

S5PV210 串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watch Dog */ ldr r0, =0xE2700000 mov r1, #0 str r1, [r0] /* 设置系统模式栈指针 */ ldr sp, =0x40000000 /* 开 IRQ 总中断开关 */ mov r0, #0x53 msr CPSR_cxsf, r0 /* 时钟初始化 */

ecos stm32 步步深入8 - 手工打造串口usart2驱动实验ecos中断

最近忙别的事情,很长时间没碰ecos了,这两天有点空,抽空写个串口驱动玩玩,也验证一下ecos的中断调用.LZ花了两天时间写好这个驱动,中间遇到了几个比较恶心的问题,后来发现是前面的基础没打好,所幸都解决了. 尽管ECOS已经写好了串口的驱动程序,只需要在配置工具中使能即可.不过别人写的毕竟不是自己的,还是自己写的用的方便,这次试验的主要目的是为了调试ecos的中断服务,让串口中断能收发数据. 首先遇到的最大的问题,事实上跟什么串口都没关系,就是debug时一执行task delay,调试程序就

实验2串口实验

0目标 1STM32 串口简介 2硬件设计 3软件设计 4下载验证 0.目标 利用串口1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑. 1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤:1) 串口时钟使能, GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)6) 使能串口7) 编写中断处理函数注:对于复用功能的 IO,我们首先要使能GPIO 

stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)

这是stm32开发中比较简单的实验,原理是通过串口助手发送信息,stm32接收到信息以后在串口助手中打印相同的内容. 这里直接分享keil5工程代码,是在工程模板的基础上移植和修改了正点原子的串口代码 百度网盘链接:https://pan.baidu.com/s/1aptEjcYPuQlDD_ayZaNoJw 提取码:8hr9 (如果失效的话可以在下方评论留下邮箱,我看到会给你发一份) 顺便把usart.c和usart.h还有mian.c中的代码复制到下面,小伙伴可以直接移植到自己的工程中 实现

实验五--中断系统

一.平台 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.中断简略 大概除了FPGA这种并行的cpu才不需要中断,像51,AVR,arm这类串行的芯片中断是他们不被淘汰的利器.没有中断,他们不可能得到这么广泛的应用. arm中断和51的类似,无非就是设置相关寄存器.中断开关,中断源,中断分辨之类的东西:但是注意,arm的中断只是7个模式下的一个,此外,中断还有普通中断和快速中断之分. 而快速中断不需要进行中断的分辨,因为每次最多只有一个被设置为快速中断. 这里看中断源分为

实验六--中断

一.环境 开发板:jz2440 系统:  ubuntu12.04 编译器:arm-linux-gcc 二.中断系统 先省下. 三.直接贴代码 Makefile: 1 objs := head.o init.o interrupt.o main.o 2 3 int.bin: $(objs) 4 arm-linux-ld -Ttext 0x00000000 -o int_elf $^ 5 arm-linux-objcopy -O binary -S int_elf [email protected]

NXP LPC17XX 串口接收发送中断(含RS485)最全面驱动程序

最近在做一个关于串口的项目,于是把之前的串口程序又拿了出来,重新优化了一下! 1.头文件<uart.h>如下: 1 /* 2 ****************************************************************************************************** 3 ** Copright(c) 2007-2014,深圳固镭特电子 ** 4 ** All rights reserved. ** 5 ** http://www.

应用程序处于中断模式

调试一个项目的时候遇到一个错误,项目一运行就提示"应用程序处于中断模式",导致无法运行,重新编译,清理解决方案....各种方法都是试过了,还是不行.. 最后想到好像引用的一个DLL,生成的时候好像"目标平台"选择的是是X86... 所以.我把当前的项目也改成了X86...运行... 哈哈..成功运行起来了~~~ 特此记录一下,以方便其他有类似情况的朋友借鉴.

autocad net 开发调试 报“应用程序处于中断模式”

如题,autocad .net开发代码时,在调试有Dialog界面的程序时,出现 “应用程序处于中断模式”导致断点无法进入的问题. 亲测有效的解决方案是 修改cad系统变量  NEXTFIBERWORLD 的值为0. 有人说NEXTFIBERWORLD 为0时会导致一些问题,没有遇到过:如果出现问题,可以把变量值改回1. 参考: https://www.cnblogs.com/yif1991/p/5796589.html https://www.cnblogs.com/junqilian/arc