STM32f103 双串口配置和中断

发布者:Meiren520最新更新时间:2017-10-02 来源: eefocus关键字:STM32f103  双串口配置  中断 手机看文章 扫描二维码
随时随地手机看文章

//代码仅仅是配置使能串口和相应的中断处理函数,具体功能需要自己定义 

//IAR 7.1

#include "stm32_uart.h"

uint8_t card_ture=0;
uint16_t add_count=0;
uint8_t Key_Data[1]={0};
uint8_t Media_Flag=0;

uint8_t card_code[4];  //[5:1]save the card SN, [0]valid or invalid
uint8_t Temp_Card_Num[4];
uint8_t cardcode_rx_complete = 0;

uint32_t uart_config_record_map[4] = {
    0,
    UART_CONFIG_UART_MEMORY_ADDR,
    FIRMWARE_VERSION_MEMORY_ADDR,
    SCHEME_SPECIFIC_MEMORY_ADDR
};

UartConfig_TypeDef the_uart_config;

void stm32_uart_init(uint8_t uart_port, uint32_t BaudRate)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    /*Fill the structure of uart init*/
    if(uart_port == UART2)
    {
        /*Fill the structure of uart init*/
        USART_InitStructure.USART_BaudRate = BaudRate;
        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;
        /*Enable priph clock*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        
        
        /*Config gpio as uart pin */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        /*Config gpio as uart pin */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        /*Init uart*/
        USART_Init(USART2, &USART_InitStructure);
        /*Enable uart*/
        /*Clear flags*/
        USART_ClearFlag(USART2, USART_FLAG_TC);
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 
        USART_Cmd(USART2, ENABLE);  
    }
    else if(uart_port == UART1)
    {
        /*Enable priph clock*/
      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        
        /*Fill the structure of uart init*/
        USART_InitStructure.USART_BaudRate = BaudRate;    
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        if(the_uart_config.checksum==Parity_No)
        {
            USART_InitStructure.USART_WordLength = USART_WordLength_8b; //USART_WordLength_8b
            USART_InitStructure.USART_Parity = USART_Parity_No;   //USART_Parity_No
        }
        else if(the_uart_config.checksum==Parity_Odd)
        {
            USART_InitStructure.USART_WordLength = USART_WordLength_9b; //USART_WordLength_9b
            USART_InitStructure.USART_Parity = USART_Parity_Odd;   //USART_Parity_Odd
        }
        else if(the_uart_config.checksum==Parity_Even)
        {
            USART_InitStructure.USART_WordLength = USART_WordLength_9b; //USART_WordLength_9b
            USART_InitStructure.USART_Parity = USART_Parity_Even;   //USART_Parity_Even
        }
        else
        {
        
        }
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        
        /*Config gpio as uart pin */
        GPIO_InitStructure.GPIO_Pin = UART1_TX;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        /*Init uart*/
        USART_Init(USART1, &USART_InitStructure);
        /*Enable uart*/
        //USART_Cmd(USART1, ENABLE);   
        /*Clear flags*/
        USART_ClearFlag(USART1, USART_FLAG_TC); 
#if 0       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        //USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_TXE, ENABLE); 
#endif        
        USART_Cmd(USART1, ENABLE); 
    }
}


static void stm32_uart_senddatas(uint8_t uart_port, const uint8_t* data, uint16_t len)
{
    uint16_t count;
    if(uart_port == UART1)
    {
        for(count = 0; count < len; count++)
        {
            USART_SendData(USART1, data[count]);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        }
    }
    else if(uart_port == UART2)
    {
        for(count = 0; count < len; count++)
        {
            USART_SendData(USART2, data[count]);
            while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
        }
    }
}

static uint8_t* uart1_tx_buffer;
static uint8_t uart1_tx_buffer_len;
static uint8_t uart1_tx_buffer_index = 0;
void stm32_uart_pro_poweron(ProComm_TypeDef comm)
{
    USART_ClearFlag(USART1,USART_FLAG_TC);    //清除标志位 否则第一位数据丢失
    switch(comm)

    {

    }
    //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    //USART_Cmd(USART1, ENABLE); 
}

void stm32_uart2_senddata(uint8_t uart_port, const uint8_t* data, uint16_t len)
{
    USART_ClearFlag(USART2,USART_FLAG_TC);    //清除标志位 否则第一位数据丢失
    stm32_uart_senddatas(uart_port, data,len);
}

void USART1_IRQHandler(void)
{
    
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {   
        USART_ClearITPendingBit(USART1, USART_IT_TXE);
        /* Write one byte to the transmit data register */
        USART_SendData(USART1, uart1_tx_buffer[uart1_tx_buffer_index++]);

        if(uart1_tx_buffer_index == uart1_tx_buffer_len)
        {
          /* Disable the USARTz Transmit interrupt */
          USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
          uart1_tx_buffer_index = 0;
        }
    }
}
/*
void USART2_IRQHandler(void)
{
    static uint8_t index = 1;
    static uint8_t checksum = 0;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        card_code[index] = USART_ReceiveData(USART2);
        if(index < 5)
        {
            checksum ^= card_code[index++];
        }
        else
        {
            if(checksum == card_code[5])
            {

            }
            else
            {
            }
            cardcode_rx_complete = 1;
            checksum = 0;
        }
    }
}
*/ 

void USART2_IRQHandler(void)
{
    uint8_t index=0;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        Key_Data[index] = USART_ReceiveData(USART2);
        switch(Key_Data[0])
        {
       
        }
    }
    //if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
    //{
       // USART_ClearITPendingBit(USART2, USART_IT_TXE);
    //}
}


关键字:STM32f103  双串口配置  中断 引用地址:STM32f103 双串口配置和中断

上一篇:STM32f103 看门狗使用
下一篇:STM32f103 定时器配置和中断处理函数

推荐阅读最新更新时间:2024-03-16 15:39

初学stm32-外部中断(EXTI按键中断
外部中断概述 STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持23个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。 EXTI线21:连接到RTC入侵和时间戳事件。 EXTI线22:连接到RTC唤醒事件。 对于每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 STM32F4供IO使用的
[单片机]
初学stm32-外部<font color='red'>中断</font>(EXTI按键<font color='red'>中断</font>)
ATmega16L-外部中断1例程
/*************************************** 取自周兴华的《AVR单片机C语言高级程序设计》 程序现象:PB口上的8个灯一直同时闪烁。 当按下接在PD7的一个按键时, 接在PD3的一个小灯开始闪烁 PD3对应于INT1. 闪了十次之后,PB上的灯继续闪 本例子应用了中断。 ***************************************/ #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int uint shu; /*********************
[单片机]
ACM32F303对比STM32F103差异说明
一、整体功能对比 分别选择两款芯片(LQFP64封装)最大配置资源的型号(STM32F103RG、ACM32F303RC)进行比对,两者比对如下: 二、管脚差异说明 举例如下: 举例如下:LQFP64
[单片机]
ACM32F303对比<font color='red'>STM32F103</font>差异说明
STM32F103程序设计-5-控制引脚高低电平的实现
控制引脚高低电平的实现 开发板上可以通过控制引脚高低电平的实现功能的模块:蜂鸣器、LED灯。 一.GPIO操作步骤: 1.GPIO对应时钟打开 2.设置GPIO的引脚、速度、输出模式等参数 3.引脚输出0或1 给PB5置1的方法的方法有两种: GPIOB - BSRR = 0x0020; GPIOB - BSRR |= ( 1 5);(优点,只修改某一位) 给PB5清0的方法的方法有两种: GPIOB - BSRR = 0x0000; GPIOB - BSRR &= ~( 1 5); (优点,只修改某一位) 二.熟悉相关寄存器及寄存器版实现输出电平的控制: 1.GPIOB在
[单片机]
8951定时器的定时中断模式
定时器的使用与我之前所说的中断使用差不多。首先也是设置初始化定时器。先上代码: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit led=P1^0; sbit s1=P3^0; sbit s2=P3^1; uchar counter=0; uchar temp=0; uchar flag=0; code uchar a ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint t) { uint i; while(t--) { f
[单片机]
STM32F103RC-SPI通信速率的问题
本文主要分析SPI1,因为SPI1在时钟线APB2上有些特殊。 一、要分析SPI通信速率,首先要通过STM32F103的datasheet查看一下,通常使用的工作条件,如下图。 二、通过 datasheet可以知道SPI1的通信速率可达18MHz,如下图所示。 通过datasheet可以知道SPI1的通信速率可达18Mb/s, SPI配置成8位数据宽度,则频率也就是18MHz。这个速率仅仅是在常用的工作条件下测得的。并不是说SPI1最高只能达到18MHz。fPCLK2为72MHz,SPI1至少要经过二分频,所以SPI1时钟频率最高为36MHz,这个频率按照常用条件来说,已经是超频了。18MHz仅仅是官方所以测得最稳定条件
[单片机]
<font color='red'>STM32F103</font>RC-SPI通信速率的问题
STM32F103基于DMA接收不定帧长USART数据
DMA是一种不使用CPU而将数据从一片地址空间复制到另一片地址空间的总线,这样就减少了CPU的负担,使其能够更加专注于数据运算。为了能够减少CPU的负担,DMA应该采取中断方式而非查询模式。但是非常不幸的是,STM32F103只为DMA提供了三种中断:半步中断、完成中断和错误中断。如果UART接收的是定帧长的数据,则可以开启DMA半步中断,并且目标地址长度为帧长两倍。这样每接收完一帧进一次中断,进行某些操作,是很理想的。然而当遇到如同GPS一样不定帧长的数据时,如果仍用半步中断则难以确定目标地址的长度。所以在此放弃使用DMA的中断,转而使用的是另一种比较特别的中断:UART空闲中断。 先来介绍一下UART空闲中断。UART常用的接
[单片机]
51单片机边沿触发中断响应时刻的测量
MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。51系列单片机有5个中断源,其中有2个是外部输入中断源INT0和INT1。可由中断控制寄存器TCON的IT1(TCON.2)和IT0(TCON.1)分别控制外部输入中断1和中断0的中断触发方式。若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。这里是下降沿触发中断。 1 问题的引出 几乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或者是错误
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved