中级会员
 
- 积分
- 432
- 金钱
- 432
- 注册时间
- 2016-1-19
- 在线时间
- 38 小时
|

楼主 |
发表于 2016-1-25 13:49:26
|
显示全部楼层
/**********************************************************************************
* 文件名 :usart1.c
* 硬件连接:------------------------
* | PB6 - USART1(Tx) |
* | PB7 - USART1(Rx) |
* ------------------------
* 库版本 :ST3.5.0
* 作者 :大雄
* 时间 :2016-01-19
* 备注 :开启串口DMA空闲中断接收不定长度数据,可返回该数据内容及长度
**********************************************************************************/
#include "usart1.h"
uint8_t USART1_RX_BUF[USART1_LENTH_BUF];//接收缓冲,最大64个字节
uint8_t USART1_TX_BUF[USART1_LENTH_BUF];//发送缓冲,最大64个字节
uint8_t FLAG_USART_RX = 0; //接收到数据
uint8_t LENTH_USART_RX = 0; //接收到数据的长度
void USART1_Configuration(uint32_t bound)//bound为波特率
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_Initstructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);//端口重映射
//USART1_TX PB6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART1_RX PB7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
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);
DMA_Initstructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
DMA_Initstructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RX_BUF;
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_Initstructure.DMA_BufferSize = 64;
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_Initstructure.DMA_Mode = DMA_Mode_Normal;
DMA_Initstructure.DMA_Priority = DMA_Priority_High;
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_Initstructure);
DMA_Cmd(DMA1_Channel5,ENABLE);//启动DMA
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //若总线空闲,产生中断
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //开启串口DMA接收
USART_Cmd(USART1, ENABLE); //使能串口
USART_ClearFlag(USART1, USART_FLAG_TC); //清发送完成标志/////////////////////////////////////////////////////////////A
}
//重定向c库函数printf到USART1,由printf调用
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);//将Printf内容发往串口
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);//检查串口发送是否完成的标志位TC
return (ch);
}
//输出单个字节
void USART1_PutChar(uint8_t Data)
{
USART_SendData(USART1, Data);
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
}
//输出数组
void USART1_PutStr(uint8_t *str, uint8_t Data_lenth)
{
uint8_t i = 0;
for (i = 0; i < Data_lenth; i++)
{
USART1_PutChar(*str);
str++;
}
}
//串口1中断服务程序
void MY_USART1_IRQHandler(void)
{
uint8_t i = 0;
if(USART_GetITStatus(USART1, USART_IT_IDLE)==SET) { //空闲总线中断
i = USART1->SR;
i = USART1->DR; // ---待解/////////////////////////////////////////////////////////////B
DMA_Cmd(DMA1_Channel5, DISABLE); //关闭DMA
USART_ClearITPendingBit(USART1, USART_IT_IDLE); //清除中断标志
USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //禁止中断,防止覆盖
LENTH_USART_RX = 64 - DMA_GetCurrDataCounter(DMA1_Channel5); //得到真正接收数据个数
DMA1_Channel5->CNDTR = 64; //重新设置接收数据个数
DMA_Cmd(DMA1_Channel5, ENABLE); //开启DMA
FLAG_USART_RX = 1; //接收数据标志位置1
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //再次开中断
}
}
main函数中调用
while (1) {
if(FLAG_USART_RX == 1) {
USART1_PutChar(LENTH_USART_RX);
USART1_PutStr(USART1_RX_BUF, LENTH_USART_RX);
FLAG_USART_RX = 0;LED_EYE2_XOR;
}
}
有2点需重视下,A处如果屏蔽了,则上电的时候串口输出会缺少第一个数据;B是我没能理解的,有看到的请帮助理解下,多谢了!
|
|