新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2019-6-3
- 在线时间
- 13 小时
|

楼主 |
发表于 2019-8-5 12:54:43
|
显示全部楼层
/**
******************************** STM32F0xx *********************************
* @文件名 : bsp.c
* @作者 : strongerHuang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2016年05月30日
* @摘要 : BSP板级支持包源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2016-05-30 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "usb_usart1.h"
#include "zigbee_usart4.h"
#define DATA_LEN 50
uint8_t Sendcount_4=1; //发送计数
uint8_t Sendfinish_4=0;
extern uint8_t Sendsize_4;
extern uint8_t Test_Buf[];
extern uint8_t Receive_Buf[];
uint8_t Usart_Rx_Sta;
uint32_t Receive_buff_length;
uint32_t time=0;
/************************************************
函数名称 : RCC_Configuration
功 能 : 时钟配置
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void RCC_Configuration(void)
{
/* 使能AHB时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_DMA1, ENABLE);
/* 使能APB1时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);
}
/************************************************
函数名称 : NVIC_Configuration
功 能 : NVIC配置
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 外设中断 */
NVIC_InitStructure.NVIC_IRQChannel = USART3_4_IRQn; //IRQ通道:串口4
NVIC_InitStructure.NVIC_IRQChannelPriority = 1; //优先级 :1级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能IRQ通道
NVIC_Init(&NVIC_InitStructure);
}
/************************************************
函数名称 : BSP_Initializes
功 能 : 底层初始化
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void BSP_Initializes(void)
{
RCC_Configuration(); //时钟配置
NVIC_Configuration(); //NVIC配置
}
/************************************************
函数名称 : USART_GPIO_Configuration
功 能 : USART所使用管脚输出输入定义
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_4);
/* 定义USART TX_RX 引脚为复用输出 */
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0| GPIO_Pin_1); //引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //高速
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/************************************************
函数名称 : USART_Configuration
功 能 : 配置USART
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
/******************************************************************
USART参数初始化: 波特率 传输位数 停止位数 校验位数
115200 8 1 0(NO)
*******************************************************************/
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(USART4, &USART_InitStructure); //初始化USART4
USART_ITConfig(USART4, USART_IT_IDLE, ENABLE); //使能USART4空闲总线中断
USART_Cmd(USART4, ENABLE); //使能USART4
USART_DMACmd(USART4, USART_DMAReq_Rx | USART_DMAReq_Rx, ENABLE); //串口DMA收发使能
DMA_DeInit(DMA1_Channel6); //复位DMA1_Channel6
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(USART4->RDR)); //外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Receive_Buf; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //传输方向:外设 -> 内存
DMA_InitStructure.DMA_BufferSize = DATA_LEN; //传输长度
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设递增:NO
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存递增:YES
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度:Byte
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //循环模式:NO
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //优先级:高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存-内存:NO
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
// DMA_RemapConfig(DMA1,DMA1_CH6_USART4_RX); //DMA1的通道6重映射为USART4_RX
DMA_ClearFlag(DMA1_FLAG_TC6);
DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);
DMA_Cmd(DMA1_Channel6, ENABLE); //使能DMA(开始传输)
}
/************************************************
函数名称 : USART4_SendByte
功 能 : 串口4发送一字节数据
参 数 : Data --- 数据
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART4_SendByte(uint8_t Data)
{
while((USART4->ISR & USART_FLAG_TXE) == RESET);
USART4->TDR = (Data & (uint16_t)0x01FF);
}
void USART3_4_IRQHandler(void)
{
//串口空闲中断
if(USART_GetITStatus(USART4,USART_IT_IDLE)!=RESET)
{
int q;
uint16_t buff_length;
DMA_Cmd(DMA1_Channel6, DISABLE);
DMA_ClearFlag( DMA1_FLAG_TC6 );
buff_length = DATA_LEN - DMA_GetCurrDataCounter(DMA1_Channel6);
Receive_buff_length= buff_length;
DMA1_Channel6->CNDTR = DATA_LEN;
time++;
//置标志位表示接收完成
for(q=0;q<10;q++)
{
Test_Buf[q]=Receive_Buf[q];
}
q=0;
DMA_Cmd(DMA1_Channel6, ENABLE);
Usart_Rx_Sta = 0x03;
USART_ReceiveData( USART4 );
}
if(USART_GetITStatus(USART4, USART_IT_TC) != RESET) //Hart通信发送中断 ---发送完成中断
{
if(Sendcount_4==Sendsize_4)
{
Sendfinish_4=1;
Sendcount_4=1;
}
else
{
USART_SendData(USART4,Receive_Buf[Sendcount_4]);
Sendcount_4++;
}
USART_ClearITPendingBit(USART4,USART_IT_TC);
}
USART_ClearITPendingBit(USART4,USART_IT_IDLE);
if((USART4->ISR & USART_FLAG_RXNE) == USART_FLAG_RXNE)
{
USART4_SendByte((uint8_t)(USART4->RDR)); //发送接收到的字符数据
}
}
/************************************************
函数名称 : USART_Initializes
功 能 : 串口初始化
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART_Initializes(void)
{
USART_GPIO_Configuration();
USART_Configuration();
}
/************************************************
函数名称 : DMA_MemoryToPeripheral
功 能 : DMA传输(内存 -> 外设)
参 数 : PeripheralAddr--- 外设地址
MemoryAddr ------ 内存地址
BufferSize ------ 长度
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void DMA_MemoryToPeripheral(uint32_t MemoryAddr, uint32_t PeripheralAddr, uint16_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel7); //复位DMA1_Channel2
DMA_InitStructure.DMA_PeripheralBaseAddr = PeripheralAddr; //外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = MemoryAddr; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向:内存 -> 外设
DMA_InitStructure.DMA_BufferSize = BufferSize; //传输长度
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设递增:NO
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存递增:YES
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度:Byte
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //循环模式:NO
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //优先级:高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存-内存:NO
DMA_Init(DMA1_Channel7, &DMA_InitStructure);
DMA_RemapConfig(DMA1,DMA1_CH7_USART4_TX);
DMA_Cmd(DMA1_Channel7, ENABLE); //使能DMA(开始传输)
}
/************************************************
函数名称 : USART1_SendNByte
功 能 : 串口4发送N个字符
参 数 : pData ----- 字符串
Length --- 长度
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART4_SendNByte(uint8_t *pData, uint16_t Length)
{
while(Length--)
{
USART4_SendByte(*pData);
pData++;
}
}
int main(void)
{
BSP_Initializes();
USART_Initializes();
while(1)
{
/* 发送 */
if((time>1)&&(Usart_Rx_Sta==0x03))
{
Test_Buf[Receive_buff_length]=0x99;
Sendsize_4=Receive_buff_length+1;
USART_SendData(USART4,Test_Buf[0]);
DMA_MemoryToPeripheral((uint32_t)Test_Buf, (uint32_t)(&(USART4->TDR)), Receive_buff_length+1);
while(!DMA_GetFlagStatus(DMA1_IT_TC7))
{ //等待传输完成
}
DMA_ClearFlag(DMA1_IT_GL7); //清除标志位
Usart_Rx_Sta=0;
}
} //usb转串口引脚初始化
/**** Copyright (C)2016 strongerHuang. All Rights Reserved **** END OF FILE ****/
|
|