RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
stm32f10x串口实验之中断模式

    

创新互联是专业的遂昌网站建设公司,遂昌接单;提供成都做网站、成都网站设计、成都外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行遂昌网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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);     //清除中断标志位;

}

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

弟子规第二天:

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

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

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

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

百事孝为先!

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

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

加油!


文章标题:stm32f10x串口实验之中断模式
标题路径:http://lswzjz.com/article/gjjdop.html