历史上的今天
今天是:2024年09月10日(星期二)
2019年09月10日 | 关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现
2019-09-10 来源:eefocus
主函数中代码如下:
#include "stm32f10x.h"
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
void NVIC_Config(void);
void LED1_ON(void);
void LED2_ON(void);
void LED3_ON(void);
void LED4_ON(void);
void LED_ALL_OFF(void);
void delay(void);
uint8_t DMA_BUFFER[1];
int main()
{
GPIO_Config();
USART_Config();
DMA_Config();
NVIC_Config();
USART_DMACmd(USART1,USART_DMAReq_Rx, ENABLE);//使能DMA接收
while(1)
{
switch(DMA_BUFFER[0])
{
case '1' :LED1_ON();break;//点亮LED1
case '2' :LED2_ON();break;//点亮LED2
case '3' :LED3_ON();break;//点亮LED3
case '4' :LED4_ON();break;//点亮LED4
case '5' :LED_ALL_OFF();break;//熄灭所有LED
}
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStr;//定义GPIO初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC, ENABLE);//使能相关GPIO、AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能USART1的重映射
/*设置Tx管脚*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init( GPIOB, &GPIO_InitStr);
/* 设置Rx管脚*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init( GPIOB, &GPIO_InitStr);
/*设置指示状态用的PC6*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init( GPIOC, &GPIO_InitStr);
GPIO_SetBits( GPIOC, GPIO_Pin_6);
/*设置指示状态用的PC7*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init( GPIOC, &GPIO_InitStr);
GPIO_SetBits( GPIOC, GPIO_Pin_7);
/*设置指示状态用的PC8*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init( GPIOC, &GPIO_InitStr);
GPIO_SetBits( GPIOC, GPIO_Pin_8);
/*设置指示状态用的PC9*/
GPIO_InitStr.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init( GPIOC, &GPIO_InitStr);
GPIO_SetBits( GPIOC, GPIO_Pin_9);
}
void USART_Config(void)
{
USART_InitTypeDef USART_InitStr;//定义串口初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1的时钟
/*设置波特率115200,8位数据位,1位停止位,无校验,无硬件流控制,收发双工*/
USART_InitStr.USART_BaudRate=115200;
USART_InitStr.USART_WordLength=USART_WordLength_8b;
USART_InitStr.USART_StopBits=USART_StopBits_1;
USART_InitStr.USART_Parity=USART_Parity_No;
USART_InitStr.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStr.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStr);//初始化USART1
USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);//使能串口1的输入中断
USART_Cmd( USART1,ENABLE);//使能USART1
}
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStr; //定义DMA_InitTypeDef类型初始化结构体
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA1的时钟
DMA_InitStr.DMA_PeripheralBaseAddr= (uint32_t)(&(USART1->DR));//外设地址为USART1的DR寄存器
DMA_InitStr.DMA_MemoryBaseAddr=(uint32_t)&DMA_BUFFER;//内存地址为DMA_BUFFER[1]的首地址
DMA_InitStr.DMA_DIR=DMA_DIR_PeripheralSRC;//外设向内存传输
DMA_InitStr.DMA_BufferSize=1;//传送数目为1
DMA_InitStr.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地址不增加
DMA_InitStr.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址自动加1
DMA_InitStr.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//外设数据宽度为byte,即8位
DMA_InitStr.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; //内存数据宽度byte
DMA_InitStr.DMA_Mode=DMA_Mode_Circular; //DMA模式为循环模式
DMA_InitStr.DMA_Priority=DMA_Priority_High; //优先级为高
DMA_InitStr.DMA_M2M=DMA_M2M_Disable; //禁用内存至内存模式
DMA_Init(DMA1_Channel5, &DMA_InitStr);//初始化USART1的Rx所在的DMA1的通道5
DMA_Cmd(DMA1_Channel5, ENABLE);//使能DMA1的通道5
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStr;
/*使能串口1的中断向量*/
NVIC_InitStr.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStr.NVIC_IRQChannelSubPriority=0;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE ;
NVIC_Init(&NVIC_InitStr);
}
void delay(void)
{
unsigned int i;
for(i=500000;i>0;i--);
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6);//点亮LED1
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7);//点亮LED2
}
void LED3_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8);//点亮LED3
}
void LED4_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_9);//点亮LED4
}
void LED_ALL_OFF(void)
{
GPIO_SetBits( GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //熄灭所有LED
}
在stm32f10x_it.c文件代码如下:
extern uint8_t DMA_BUFFER[1];
void USART1_IRQHandler(void)//USART1中断服务函数
{
USART_SendData(USART1,DMA_BUFFER[0]);//显示向内存发送的字符
}

在此中断函数中不可使用以下函数,否则会出现串口回显空
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
史海拾趣
|
看了好久一直没明白!问一下各位: 系统缓冲区,帧缓冲区,和LCDBASEU.LCDBANK,LCDBASEL是什么关系啊 如果可以的话能不能提供一下lcd的驱动程序啊 谢谢… 查看全部问答> |
|
问一下cmake、scons等自动生成makefile工具都有自己的dependency scanner 哪个是可以自己修改的?怎么增加一个自己定义的依赖?… 查看全部问答> |
|
wince中录音应该使用哪个DLL文件,哪些函数,是Coredll.dll吗? wince中录音应该使用哪个DLL文件,哪些函数,是Coredll.dll吗?开始做这个,不想走重复路… 查看全部问答> |
|
各位,请问一下,触摸屏校准问题,我使用的是友善之臂的s3c2440的开发板,在qtopia core4.3.5做的图形代码, 现在在板子上跑,发现一个问题,就是触摸屏可以响应,左右划动是正确的,但是上下划动则是想相反的,请各位给予帮助 我认为是坐标校准 ...… 查看全部问答> |
|
【求助】I2S中 _WrL3Data(0xf2,0);是什么意思? 本人比较小白 实在看不懂下面这段代码 希望大侠 能帮分析下~~~谢谢了~ 代码如下: _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00) _WrL3Data(0xc2,0);  ...… 查看全部问答> |
|
我需要在EVC写一个程序,对ZIP文件进行解压,请问应该怎么做?听说SharpZipLib这个DLL能实现,但是网上只有C#的(我对C#不熟悉,只用过C++),不知道在WINCE下能否调用?最好能说一下思路,谢谢!… 查看全部问答> |
|
近日利用IAR5.3大模式对MSP430F5438进行编程,程序、全局变量和const常量大约各自分别为12K、7K和1K,前时一直顺利,可最近却常常在编译、连接均一切正常情况下无法完全下载并调试。反复排查时好时坏,好时能够下载但增加几行程序原现象再次发生, ...… 查看全部问答> |




