STM32--串口源程序

来源:互联网 发布:足球打水软件多少钱 编辑:程序博客网 时间:2024/05/22 14:05

    STM32的串口使用起来非常简单,有三种方法:查询、中断、DMA,由于版主只用过前两种,并且DMA方法配置起来并不困难,故在此只贴出查询和中断的源代码,标注非常详细,只需做相应修改即可。

1、程序源代码(查询)

功能藐视:串口调试助手HEX输出55

#include "stm32f10x.h"
#include "stm32f10x_it.h"

extern uint32_t g_Timer2_num;


/* Private function prototypes -----------------------------------------------*/
void DelayMs(uint32_t ms);
void Tim_1ms_Interrupt_Config(void);
void COM_Config(void);


/* Private functions ---------------------------------------------------------*/
int main(void)
{
SystemInit(); //系统时间配置


Tim_1ms_Interrupt_Config();//1ms定时中断配置


COM_Config(); //串口配置


while(1)
{
USART_SendData(USART1, 0x55);  
DelayMs(500);
}
}


void DelayMs(uint32_t ms)
{
while(g_Timer2_num != ms);
g_Timer2_num = 0;
}




void Tim_1ms_Interrupt_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


TIM_DeInit(TIM2);


/*36MHz的APB1,由于APB1是AHB的分频,所以时钟是APB1的2倍频,即为72MHz,故1ms为72MHz*1ms = 72000,即计数周期为
预分频周期为0-71和普通计数周期为0-999。*/
TIM_TimeBaseStructure.TIM_Period = (1000-1);
TIM_TimeBaseStructure.TIM_Prescaler = (72-1);
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;


TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


TIM_ClearFlag(TIM2, TIM_FLAG_Update);


TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);


TIM_Cmd(TIM2, ENABLE);


}


void COM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStruct;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA, ENABLE);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //USART1 TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //A端口 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        //USART1 RX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);        //A端口

USART_InitStructure.USART_BaudRate = 115200;//速率115200bps
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位8位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位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;//收发模式


  /* Configure USART1 */
  USART_Init(USART1, &USART_InitStructure);//配置串口参数函数
 
  
  /* Enable USART1 Receive and Transmit interrupts */
  //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断
  //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能发送缓冲空中断
    //USART_ITConfig(USART1, USART_IT_TC, ENABLE); //使能发送完成中断


  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE); 
}

2、程序源代码(中断)

功能描述:系统复位输出字符b


#include "stm32f10x.h"
#include "stdio.h"

/* Private function prototypes -----------------------------------------------*/
void RCC_Config(void);
void GPIO_Config(void);
void NVIC_Config(void);
void USART_Config(void);


int main(void)


{
    RCC_Config();
    GPIO_Config();
NVIC_Config();
USART_Config();
USART_ClearFlag(USART1,USART_FLAG_TC);
while(1)
{}
}


void RCC_Config(void)
{
  {
  ErrorStatus HSEStartUpStatus;                                 // 定义错误状态变量
  RCC_DeInit();                                //初始化RCC
  RCC_HSEConfig(RCC_HSE_ON);                        //打开外部高速晶振
  HSEStartUpStatus=RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus==SUCCESS)                        //等待外部晶振打开
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);                        //如果外部晶振就绪,设置AHB时钟为系统时钟
    RCC_PCLK2Config(RCC_HCLK_Div1) ;                    //设置高速时钟APB2为72MHz
    RCC_PCLK1Config(RCC_HCLK_Div2) ;                    //设置低速时钟APB1为系统时钟2分频
    FLASH_SetLatency(FLASH_Latency_2);                          //设置FLASH代码延时
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //使能预取指缓存
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //设置PLL时钟,为外部时钟的9倍频
    RCC_PLLCmd(ENABLE);                                         //使能PLL
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);   //等待PLL准备就绪
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                  //设置PLL为系统时钟
    while(RCC_GetSYSCLKSource() != 0x08);    //判断PLL是否为系统时钟
  }
}
}


void GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
   /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   /* Configure USART1 Rx (PA.10) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


}


void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //4位用作指定响应优先级
  
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}




void USART_Config(void)
{ USART_InitTypeDef USART_InitStructure;  
USART_StructInit(&USART_InitStructure);


// USART_ClockInitTypeDef  USART_ClockInitStructure;//定义串口模式初始化结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE); 



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;
  /* Configure USART1 */
  USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);      //使能串口接收中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   //使能串口发送中断


  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);




/* 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,
   而TXE=1,表明发送数据寄存器为空, TC=1表明发送已完成
   两句使能中断,也就是说当TXE=1就会进入中断,所以程序初始化后就能进入中断*/
}


stm32f10x_it.c中,我们找到函数void USART1_IRQHandler(),向其添加代码

void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {   
   
    USART_SendData(USART1, 'b');
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
   
  }


}