找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1922|回复: 0
打印 上一主题 下一主题
收起左侧

STM32f1的Usart的应用

[复制链接]
跳转到指定楼层
楼主
ID:113276 发表于 2016-4-10 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试背景:Device--Stm32f103vet6--Usart1;MDK5说明:在嵌入式方面,串口通信有着不可替代的优势,每当我们入手一块新型的单片机时,往往会先学习”点灯大法(IO口)“,然后学习串口通信,毫不夸张的说,串口相当于单片机的一双眼睛,通过这双眼睛,可以监视单片机的运行情况,及时发现问题,加快学习的速度。本篇文章以Stm32f103vet6的Usart1为例来举例说明如何利用串口中断与上位机进行简单通信,以为笔记。(后附程序)
主要有以下几个步骤:
1、系统时钟的配置:本文系统时钟设置为72M,并开启Usart1的时钟;
2、IO口的配置:PA9h和PA10;
3、Usart的配置:本文波特率115200;
4、中断优先级的设置。
下为程序代码:

//主函数文件
#include"stm32f10x_lib.h"

voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
voidNVIC_Configuration(void);

int main(void)
{
  
   RCC_Configuration();
  
   GPIO_Configuration();
  
   USART_Configuration();
  
NVIC_Configuration();
   while(1)
   {
      
   }
}

voidRCC_Configuration(void)
{
  
   ErrorStatus HSEStartUpStatus;
   
  
   RCC_DeInit();
  
   RCC_HSEConfig(RCC_HSE_ON);
  
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
  
   if(HSEStartUpStatus == SUCCESS)
   {
   
   RCC_HCLKConfig(RCC_SYSCLK_Div1);
   
   RCC_PCLK2Config(RCC_HCLK_Div1);
   
   RCC_PCLK1Config(RCC_HCLK_Div2);
   
   FLASH_SetLatency(FLASH_Latency_2);
   
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
   
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
   
   RCC_PLLCmd(ENABLE);
   
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET);
   
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   
   while(RCC_GetSYSCLKSource() != 0x08);
   }   
  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE);
}


voidGPIO_Configuration(void)
{
  
   GPIO_InitTypeDef GPIO_InitStructure;
   
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA , &GPIO_InitStructure);
   
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA , &GPIO_InitStructure);
}


voidUSART_Configuration(void)
{
  
   USART_InitTypeDef USART_InitStructure;
   
   USART_InitStructure.USART_BaudRate = 115200;
   USART_InitStructure.USART_WordLength =USART_WordLength_8b;
   USART_InitStructure.USART_StopBits =USART_StopBits_1;
   USART_InitStructure.USART_Parity = USART_Parity_No ; //奇偶校验失能
   USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;
   USART_Init(USART1 , &USART_InitStructure);
   
//使能USART1接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中断使能
  
   USART_Cmd(USART1 , ENABLE);
}

voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;

  
#ifdef  VECT_TAB_RAM
  
NVIC_SetVectorTable(NVIC_VectTab_RAM ,0x0);
#else
  
NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);  
#endif
  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  
NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


//中断函数
voidUSART1_IRQHandler(void)
{

//接收中断(接收寄存器非空)
if(USART1->SR & (1<<5))
{
USART_SendData(USART1 ,USART_ReceiveData(USART1));  //发送数据
}
}








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表