STM32串口寄存器操作

发布者:csZhou最新更新时间:2016-06-15 来源: eefocus关键字:STM32  串口寄存器 手机看文章 扫描二维码
随时随地手机看文章
//USART.C

/*********************************************************************************************************/
/* USART 收发  */
/* 陈鹏 20110611*/

#include "SYSTEM.H"
#include "GPIO_INIT.H"
#include "USART.H"


//定义串口通道号最大值
#define UART_ChMax 1


//UART外设结构指针
static const  USART_TypeDef * USARTxN[5] = {USART1,USART2,USART3,UART4,UART5};

//相关UART状态结构
typedef struct
{
  FlagStatus  NewDataFlag;//接收到新数据
  FlagStatus  BuffFull; //接收Buff满
  FlagStatus  IntRx; //是否开启中断接收
  u8 *RxBuff;//接收Buff指针
  u16 RxBuffSize;//接收缓冲区大小,一帧数据大小
  u16 UartRxCnt;//接收数据计数器
} UartRx_TypeDef;


//UART1 接收状态结构
static UartRx_TypeDef UartRx[UART_ChMax + 1];


//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
  int handle; 
  /* Whatever you require here. If the only file you are using is */ 
  /* standard output using printf() for debugging, no file handling */ 
  /* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
  x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
  UARTx_SendByte(0,(u8)ch);      
  return ch;
}
#endif 
//end
//////////////////////////////////////////////////////////////////



/*************************************************************************************************************************
 * 函数 :  u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
 * 功能 :  串口初始化
 * 参数 :  ch:通道选择,0->usart1;SYS_CLK当前系统时钟,Speed:串口速度,RX_Int:是否时能中断接受
 * 返回 :  0:成功,1:失败
 * 依赖 :  底层宏定义
 * 作者 :  陈鹏
 * 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : USART1~UART5,对应通道0~4
*************************************************************************************************************************/
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)
{
  USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch];   //获取对应通道硬件基址指针
  u32 clock;
  u8 irq_n;
  float fclk;


  if(ch > UART_ChMax)
  return 1;  //端口号超出范围
  //初始化UART IO
  DeviceClockEnable(DEV_AFIO,ENABLE);//复用功能AFIO时钟使能
  switch (ch)
  {
    case 0:  //通道0,USART1 ,TX:PA9;RX:PA10
    {
      DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能
      DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 时钟使能
      GPIOx_Init(GPIOA,BIT9,AF_PP, SPEED_10M);   
      //PA09,TXD只能设置成复用推挽输出
      GPIOx_Init(GPIOA,BIT10,IN_FLOATING,IN_IN);  //浮空输入
      DeviceReset(DEV_USART1);//复位串口1
      irq_n =  IRQ_USART1;//串口1中断号
    }break;

    case 1:  //通道1,USART2 ,TX:PA2;RX:PA3
    { 
      DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能
      DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 时钟使能
      GPIOx_Init(GPIOA,BIT2,AF_PP, SPEED_10M);   
      //PA2,TXD只能设置成复用推挽输出
      GPIOx_Init(GPIOA,BIT3,IN_FLOATING,IN_IN);  //浮空输入
      DeviceReset(DEV_USART2);//复位串口2
      irq_n =  IRQ_USART2;//串口2中断号
    }break;

    case 2:  //通道2,USART3 ,TX:PD8;RX:PD9
    {
      DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能
      DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 时钟使能
      GPIOx_Init(GPIOD,BIT8,AF_PP, SPEED_10M);   
      //PD8,TXD只能设置成复用推挽输出
      GPIOx_Init(GPIOD,BIT9,IN_FLOATING,IN_IN);  //浮空输入
      DeviceReset(DEV_USART3);//复位串口3
      irq_n =  IRQ_USART3;//串口3中断号
    }break;

    case 3:  //通道3,UART4 ,TX:PC10;RX:PC11
    {
      DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能
      DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 时钟使能
      GPIOx_Init(GPIOC,BIT10,AF_PP, SPEED_10M);   //PC10,TXD只能设置成复用推挽输出
      GPIOx_Init(GPIOD,BIT11,IN_FLOATING,IN_IN);  //浮空输入
      DeviceReset(DEV_UART4);//复位串口3
      irq_n =  IRQ_UART4;//串口3中断号
    }break;

    case 4:  //通道4,UART5 ,TX:PC12;RX:PD2
    {
      DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能
      DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能
      DeviceClockEnable(DEV_UART5,ENABLE);//UART 5 时钟使能
      GPIOx_Init(GPIOC,BIT12,AF_PP, SPEED_10M);   //PC12,TXD只能设置成复用推挽输出
      GPIOx_Init(GPIOD,BIT2,IN_FLOATING,IN_IN);  //浮空输入
      DeviceReset(DEV_UART5);//复位串口3
      irq_n =  IRQ_UART5;//串口3中断号
    }break;

    default : 
      return 1;//端口号超出范围,返回错误
  }

  //设置波特率分频系数
  clock = SYS_CLK * 1;//USART1时钟
  if(ch > 0)
  clock /= 2;  //USART2,3,4,5时钟
  fclk = (float)clock / 16.0 / Speed;//计算波特率分频系数
  clock = (u16)fclk;//得到波特率分频系数整数部分

  UARTx->BRR =  clock << 4;//设置波特率整数部分
  fclk -= clock;//得到波特率分频系数小数部分
  fclk *= 16;
  UARTx->BRR = 0xf & (u16)fclk;//设置波特率小数部分
  //配置UART
  UARTx->CR1 = 0x2;//使能USART,1个开始位,8位数据
  UARTx->CR1 = 0x8;//置TE = 1;发送使能;发送第一个空闲位
  UARTx->CR1 = 0x04;//RE = 1;接收使能
  SetUartRxBuff(ch,0,NULL);//设置串口接收缓冲区
  UARTx_ClearRxInt(ch);  //清除串口接收中断标志
  if(RX_Int)
  {
    UARTx->CR1 = 0x20;//RXNEIE = 1,开RXNE中断,即开启接收中断
    NVIC_IntEnable(irq_n,1);//开启USART1全局中断
    UartRx[ch].IntRx = SET;//中断接收标志有效
  } 
  else
  {
    NVIC_IntEnable(irq_n,0); 
    //关闭USART全局中断
    UartRx[ch].IntRx = RESET;//中断接收标志无效
  }
  UARTx_SendByte(0,'S');//发送一字节数据
}



 /*************************************************************************************************************************
 * 函数 :  u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)
 * 功能 :  串口配置
* 参数 :  ch:通道选择,0->usart1;cfg:串口配置结构指针
* 返回 :  0:成功,非0:失败
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120408
 * 最后修改时间 : 20120408
 * 说明 : USART1~UART5,对应通道0~4 ,返回1:校验设置错误,2:停止位设置错误,3:通道超出范围
*************************************************************************************************************************/
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)
 {
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch];   //获取对应通道硬件基址指针


if(ch > UART_ChMax)//判断端口是否超出范围
return 3;
UARTx_PowerDown(ch);//进入掉电模式,进行配置
switch (cfg->OddEvenVerify)//设置校验位
{
case UART_VERIFY_NULL://无校验
{
UARTx->CR1 &= ~BIT12;//一个起始位,8个数据位
UARTx->CR1 &= ~BIT10;//禁止校验控制
}break;
case UART_ODD://奇校验
{
UARTx->CR1 = BIT12;//一个起始位,9个数据位
UARTx->CR1 = BIT10;//使能校验控制
UARTx->CR1 = BIT9;//奇校验
}break;
case UART_EVEN://偶校验
{
UARTx->CR1 = BIT12;//一个起始位,9个数据位
UARTx->CR1 = BIT10;//使能校验控制
UARTx->CR1 &= ~BIT9;//偶校验
}break;
default : 
{
UARTx_PowerOn(ch);//串口重新上电
return 1;  //设置错误,返回校验设置错误1
}
}
if(cfg->StopBitWidth == UART_STOP_1BIT) 
//设置停止位
{
UARTx->CR2 &= ~(0x3 << 12);//清除设置,默认一个停止位
}
else if(cfg->StopBitWidth == UART_STOP_2BIT)
{
UARTx->CR2 &= ~(0x3 << 12);
UARTx->CR2 = (0x2 << 12);//2个停止位
} 
else
{
UARTx_PowerOn(ch);//串口重新上电
return 2;  //停止位设置错误,返回错误2
}
UARTx_PowerOn(ch);//串口重新上电

return 0;  //设置完成,返回0
 }



 /*************************************************************************************************************************
 * 函数 :  void UARTx_SendByte(u8 ch,u8 data)
 * 功能 :  UART单字节发送
* 参数 :  ch:通道号,dataL:要发送的数据
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 通道号为0 - 4;
 *************************************************************************************************************************/
 void UARTx_SendByte(u8 ch,u8 data)
 {
USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch];   //获取对应通道硬件基址指针


if(ch > UART_ChMax)//判断端口是否超出范围
return;


while(!(UARTx->SR & 0x80));//等待发送寄存器为空,(否则连续发送时数据易丢失 )
   UARTx->DR = data;//发送数据
while(!(UARTx->SR & 0x40));//等待TC = 1;也就是发送完成
UARTx->SR &= ~(1 << 6);//清除发送完成标志
}



 /*************************************************************************************************************************
 * 函数 :  void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)
 * 功能 :  UART数据发送函数
* 参数 :  ch:通道号,tx_buff:发送缓冲区,byte_number:需要发送的字节
* 返回 :  无
* 依赖 :  void UART_SendByte(u8 ch,u8 data)
 * 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 非DMA方式,非FIFO方式发送
*************************************************************************************************************************/
void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)
 {
u8 i;


if(ch > UART_ChMax)//判断端口是否超出范围
return;
for(i = 0;i < byte_number;i++)//循环发送,直至发送完毕
{
UARTx_SendByte(ch,tx_buff[i]);
}
 }



 /*************************************************************************************************************************
 * 函数 :  void UARTx_PowerDown(u8 ch)
 * 功能 :  UART掉电
* 参数 :  ch:通道选择
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 进入低功耗模式;通道号为0 - 4;
 *************************************************************************************************************************/
 void UARTx_PowerDown(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return;
((USART_TypeDef *)USARTxN[ch])->BRR = (1 << 13);//UE位写一,开启低功耗

}

 /*************************************************************************************************************************
 * 函数 :  void UARTx_PowerOn(u8 ch)
 * 功能 :  UART上电
* 参数 :  ch:通道选择
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 退出低功耗模式;通道号为0 - 4;
 *************************************************************************************************************************/
 void UARTx_PowerOn(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return;
   ((USART_TypeDef *)USARTxN[ch])->BRR &= ~(1 << 13);//UE位清零,退出低功耗模式

}



 /*************************************************************************************************************************
 * 函数 :  u8 GetUartNewFlag(u8 ch)
 * 功能 :  获取串口新数据标志
* 参数 :  ch:通道选择
* 返回 :  1:有新数据,0:无新数据
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 用于判断是否有新的数据,会清除掉新数据标志的
*************************************************************************************************************************/
u8 GetUartNewFlag(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return 0;


if(UartRx[ch].IntRx == SET)//开启了中断接收
{
if(UartRx[ch].NewDataFlag == SET) 
//有新数据
{
UartRx[ch].NewDataFlag = RESET;//清除标志
return 1;  //返回有新数据
}
else
return 0;  //无新数据
}
else //没开启中断接收
{
if(((USART_TypeDef *)USARTxN[ch])->SR & BIT5)//RXNE=1,接收到新数据
{
((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除标志
return 1;
}
else 
return 0;
}
 }

 /*************************************************************************************************************************
 * 函数 :  u8 GetUartRxBuffFullFlag(u8 ch)
 * 功能 :  获取串口接收缓冲区满标志
* 参数 :  ch:通道选择
* 返回 :  1:有新数据,0:无新数据
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 用于判断接收缓冲区是否满,会清除标志
*************************************************************************************************************************/
u8 GetUartRxBuffFullFlag(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return 0;
if(UartRx[0].BuffFull == SET)//缓冲区已满
{
UartRx[0].BuffFull = RESET;//清除满标志
return 1;
}
return 0;
 }




 /*************************************************************************************************************************
 * 函数 :  void UART_ClearRxInt(u8 ch)
 * 功能 :  清除串口接收中断标志
* 参数 :  ch:通道选择
* 返回 :  物
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 用于清除接收标志
*************************************************************************************************************************/
void UARTx_ClearRxInt(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return;
((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除标志
}


 /*************************************************************************************************************************
 * 函数 :  u8 GetUartNewData(u8 ch)
 * 功能 :  获取串口新数据
* 参数 :  ch:通道选择
* 返回 :  收到的数据
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 用于接收一个字节数据
*************************************************************************************************************************/
u8 GetUartNewData(u8 ch)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return 0;


return (((USART_TypeDef *)USARTxN[ch])->DR);//返回数据
}



 /*************************************************************************************************************************
 * 函数 :  void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)
 * 功能 :  设置串口接收缓冲区
* 参数 :  ch:通道选择,RxBuffSize:缓冲区大小,RxBuff:缓冲区指针
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20120403
 * 最后修改时间 : 20120403
 * 说明 : 一定要设置,否则开启中断接收时可能会异常
*************************************************************************************************************************/
void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)
 {
if(ch > UART_ChMax)//判断端口是否超出范围
return;
UartRx[ch].RxBuffSize = RxBuffSize; 
//设置缓冲区大小
UartRx[ch].RxBuff = RxBuff;//设置缓冲区指针
UartRx[0].UartRxCnt = 0;//计数器清零
}



 /*************************************************************************************************************************
 * 函数 :  void USART1_IRQHandler (void)
 * 功能 :  UART1中断接收函数
* 参数 :  无
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20110611
 * 最后修改时间 : 20120403
 * 说明 : 无
*************************************************************************************************************************/
void USART1_IRQHandler (void)
 {
if((USART1->SR & BIT2)  (USART1->SR & BIT1))//如果NE = 1发送噪声错误  //如果FE = 1,发送帧错误
{
if(USART1->SR);
if(USART1->DR);//复位NE操作序列
}
else if(UartRx[0].RxBuffSize > 0)//接收缓冲区大于0
{
(UartRx[0].RxBuff)[(UartRx[0].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区
if(UartRx[0].UartRxCnt == UartRx[0].RxBuffSize)//缓冲区已满
{
 UartRx[0].UartRxCnt = 0;//接收计数器清零
 UartRx[0].BuffFull = SET;//缓冲区已满标志
} 
}
UartRx[0].NewDataFlag = SET;//收到新数据标志
UARTx_ClearRxInt(0);  //清除串口接收中断标志
}


 #if UART_ChMax > 0
 /*************************************************************************************************************************
 * 函数 :  void USART2_IRQHandler (void)
 * 功能 :  UART2中断接收函数
* 参数 :  无
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20110611
 * 最后修改时间 : 20120403
 * 说明 : 无
*************************************************************************************************************************/
void USART2_IRQHandler (void)
 {
if((USART2->SR & BIT2)  (USART2->SR & BIT1))//如果NE = 1发送噪声错误  //如果FE = 1,发送帧错误
{
if(USART2->SR);
if(USART2->DR);//复位NE操作序列
}
else if(UartRx[1].RxBuffSize > 0)//接收缓冲区大于0
{
(UartRx[1].RxBuff)[(UartRx[1].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区
if(UartRx[1].UartRxCnt == UartRx[1].RxBuffSize)//缓冲区已满
{
 UartRx[1].UartRxCnt = 0;//接收计数器清零
 UartRx[1].BuffFull = SET;//缓冲区已满标志
} 
}
UartRx[1].NewDataFlag = SET;//收到新数据标志
UARTx_ClearRxInt(1);  //清除串口接收中断标志
}
 #endif




 #if UART_ChMax > 1
 /*************************************************************************************************************************
 * 函数 :  void USART3_IRQHandler (void)
 * 功能 :  UART3中断接收函数
* 参数 :  无
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20110611
 * 最后修改时间 : 20120403
 * 说明 : 无
*************************************************************************************************************************/
void USART3_IRQHandler (void)
 {
if((USART3->SR & BIT2)  (USART3->SR & BIT1))//如果NE = 1发送噪声错误  //如果FE = 1,发送帧错误
{
if(USART3->SR);
if(USART3->DR);//复位NE操作序列
}
else if(UartRx[2].RxBuffSize > 0)//接收缓冲区大于0
{
(UartRx[2].RxBuff)[(UartRx[2].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区
if(UartRx[2].UartRxCnt == UartRx[2].RxBuffSize)//缓冲区已满
{
 UartRx[2].UartRxCnt = 0;//接收计数器清零
 UartRx[2].BuffFull = SET;//缓冲区已满标志
} 
}
UartRx[2].NewDataFlag = SET;//收到新数据标志
UART_ClearRxInt(2);  //清除串口接收中断标志
}
 #endif




 #if UART_ChMax > 2
 /*************************************************************************************************************************
 * 函数 :  void UART4_IRQHandler (void)
 * 功能 :  UART4中断接收函数
* 参数 :  无
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20110611
 * 最后修改时间 : 20120403
 * 说明 : 无
*************************************************************************************************************************/
void UART4_IRQHandler (void)
 {
if((UART4->SR & BIT2)  (UART4->SR & BIT1))//如果NE = 1发送噪声错误  //如果FE = 1,发送帧错误
{
if(UART4->SR);
if(UART4->DR);//复位NE操作序列
}
else if(UartRx[3].RxBuffSize > 0)//接收缓冲区大于0
{
(UartRx[3].RxBuff)[(UartRx[3].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区
if(UartRx[3].UartRxCnt == UartRx[3].RxBuffSize)//缓冲区已满
{
 UartRx[3].UartRxCnt = 0;//接收计数器清零
 UartRx[3].BuffFull = SET;//缓冲区已满标志
} 
}
UartRx[3].NewDataFlag = SET;//收到新数据标志
UART_ClearRxInt(3);  //清除串口接收中断标志
}
 #endif






 #if UART_ChMax > 3
 /*************************************************************************************************************************
 * 函数 :  void UART5_IRQHandler (void)
 * 功能 :  UART5中断接收函数
* 参数 :  无
* 返回 :  无
* 依赖 :  底层宏定义
* 作者 :  陈鹏
* 时间 :  20110611
 * 最后修改时间 : 20120403
 * 说明 : 无
*************************************************************************************************************************/
void UART5_IRQHandler (void)
 {
if((UART5->SR & BIT2)  (UART5->SR & BIT1))//如果NE = 1发送噪声错误  //如果FE = 1,发送帧错误
{
if(UART5->SR);
if(UART5->DR);//复位NE操作序列
}
else if(UartRx[4].RxBuffSize > 0)//接收缓冲区大于0
{
(UartRx[4].RxBuff)[(UartRx[4].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区
if(UartRx[4].UartRxCnt == UartRx[4].RxBuffSize)//缓冲区已满
{
 UartRx[4].UartRxCnt = 0;//接收计数器清零
 UartRx[4].BuffFull = SET;//缓冲区已满标志
} 
}
UartRx[4].NewDataFlag = SET;//收到新数据标志
UART_ClearRxInt(4);  //清除串口接收中断标志
}
 #endif




 #undef UART_ChMax
 //USART.H
 /**************************************************************************************************/
 /* USART 通用同步异步串行发送接收*/
 /* 陈鹏 20110609*/


 #ifndef _USART_H
 #define _USART_H


 #include "system.h"
 #include "stdio.h"


 //UART配置相关结构定义
typedef struct
{
  u8 OddEvenVerify;//奇偶校验,奇,偶,无
  u8 StopBitWidth;//停止位位宽1,2
} UART_Config_TypeDef;


 //奇偶校验
#define UART_VERIFY_NULL 0//无校验
#define UART_ODD 1//奇校验
#define UART_EVEN 2//偶校验
//停止位
#define UART_STOP_1BIT 0//一个停止位
#define UART_STOP_2BIT 1//2个停止位



//相关API
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int);//串口初始化
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg);  //串口配置
void UARTx_SendByte(u8 ch,u8 data); //UART单字节发送
void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number);  //UART数据发送函数
void UARTx_PowerDown(u8 ch); //UART掉电
void UARTx_PowerOn(u8 ch); //UART上电
u8 GetUartNewFlag(u8 ch); //获取串口新数据标志
u8 GetUartRxBuffFullFlag(u8 ch); //获取串口接收缓冲区满标志
u8 GetUartNewData(u8 ch); //获取串口新数据
void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff);//设置串口接收缓冲区
void UARTx_ClearRxInt(u8 ch); //清除串口接收中断标志

#endif

 

关键字:STM32  串口寄存器 引用地址:STM32串口寄存器操作

上一篇:stm32的串口空闲中断接收数据
下一篇:stm32 BKP寄存器操作操作寄存器+库函数

推荐阅读最新更新时间:2024-03-16 14:57

STM32 I2C上拉电阻的选择问题
从开源的设计中我们可以看到,I2C的上拉电阻可以是1.5K,2.2K,4.7K,然而电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K 或2.2K。 上拉电阻阻值的确定: 由于I2C 接口采用Open Drain 机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP 将信号线拉至高电平。因此I2C 总线上的上拉电阻是必须的! RP 不宜过小,一般不低于1KΩ。 一般IO 端口的驱动能力在2mA~4mA 量级。如果RP 阻值过小,VDD 灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C 协议规定,端口输出低电平的最高允许值为0.4V);如果灌入端口的电流过大,还可能损坏
[单片机]
STM32串口通信详解以及通信异常或者卡死常见问题分析
异常一:数据传输中会出现乱码 数据传输中会出现乱码,很有可能是数组溢出,或者定义的数组长度不够。或者中断被打断。 异常二:程序卡在中断函数里面无法跳出执行主函数的逻辑 中断标志位没有被清除,在这里要注意一点,串口中断标志位自动清空的前提是软件需要先读USART_SR寄存器,然后读USART_DR寄存器来自动清除。即串口中断事件发生后,如果使能的接收中断,而中断函数里面什么都不执行的话,接收中断标志位是无法自动清空的,故而,函数会一直卡在中断函数里面。 比如一下这个函数,该函数没有逻辑问题,但会引发以上问题,代码如下 extern unsigned char star_time_led ; //计时开始变量 un
[单片机]
STM32 中断使用
STM32中断有时候用多了容易乱,特此记录一下,因为之前一直是M3 M0交叉用,固件库有些区别容易弄混,这里说一下M3外部中断的配置 步骤: 1.将对应的IO配置为输入 2.将IO对应的中断的优先等级用NVIC配置好 3.设置好对应IO的中断模式和触发方式 4.将IO所属的中断线设为中断输入源 1---------以PB5为例子 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(G
[单片机]
STM32 74HC595驱动程序
以下为.h文件: #ifndef __74HC595_H__ #define __74HC595_H__ #include stm32f10x.h #define SHCP_GPIO_PORT GPIOA #define SHCP_GPIO_CLK RCC_APB2Periph_GPIOA #define SHCP_GPIO_PIN GPIO_Pin_1 #define STCP_GPIO_PORT GPIOA #define STCP_GPIO_CLK RCC_APB2Periph_GPIOA #define STCP_GPIO_PIN
[单片机]
<font color='red'>STM32</font> 74HC595驱动程序
stm32中断服务函数名称表速查
*参考启动文件 startup_stm32f10x_xl.s 中断服务函数名(固定) 匹配对象 WWDG_IRQHandler Window Watchdog PVD_IRQHandler PVD through EXTI Line detect TAMPER_IRQHandler Tamper RTC_IRQHandler RTC FLASH_IRQHandler Flash RCC_IRQHandler RCC EXTI0_IRQHandler EXTI Line 0 EXTI1_IRQHandler EXTI Line 1 EXTI2_IRQHandler EXTI Line 2 EXTI3_IRQHandler EXT
[单片机]
STM32_TIM定时-中断
今天讲解STM32F103定时器定时-中断功能,在昨天定时器延时的软件工程上添加TIM3定时的功能,自己也可以试着将昨天的工程添加修改得到。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPnJ9KYcXbPsP 访问密码 acd8 工程现象:间隔(定时器定时)500ms LED变化一次, 并且串口打印 STM32F103ZE有8个定时器(TIM1 – TIM8), 改工程以TIM3定时为例。 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 关于TIM延时,我把重要的几点在下面分别讲述,工程中
[单片机]
STM32_TIM定时-中断
STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击
前言 状态机是一种根据当前状态来执行相应动作,根据输入去改变状态的方法,出处应该在数字电路中。 我们利用状态机的思想来实现按键的消抖和一些其他功能的实现 一、状态图 我们的按键实验,就是以此状态图为基础,然后做延申,实现长短按和双击。 二、Cubemax配置 1、IO口配置 这个配置很简单,看自己的板子上按键的IO口是哪个,我这里以KEY0做演示 配置PH3为输出IO,而且由电路图可知,应该设置为上拉。 2、定时器配置 我们需要配置一个10ms的定时器,以10ms去检测按键的状态 三、代码 1、编写有关按键的结构体和定义相关参数 #define IOSTATE HAL_GPIO_ReadPin(GPI
[单片机]
<font color='red'>STM32</font> Cubemax(十二) ——利用状态机实现按键的长短按和双击
STM32启动代码概述
一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的 *.s文件和 *.c文件编译成一个 *.o文件,再对目标文件进行链接和定位,编译成功后会生成一个 *.hex文件和调试文件,接下来要进行调试,如果成功的话,就可以将它固化到 flash 里面去。 启动代码是用来初始化电路以及用来为高级语言写的软件作好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点。 比如,刚上电的过程中,PC机会对系统的一个运行频率进行锁定在一个固定的值,这个设计频率的过程就是在汇编源代码中进行的,也就是在启动代码中进行的。与此同时,设置完后,程序开始运行,注意,程序是在内存中运行的。这个时候,就需要把一些源文件
[单片机]
<font color='red'>STM32</font>启动代码概述
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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