我要用stm32外设f407外设一个2.4寸的显示屏,要在怎么做

光棍节特惠!SY-STM32F407开发板原价358元,现价318元!! - 淘e淘 - 电子工程世界-论坛
后使用快捷导航没有帐号?
查看: 2519|回复: 2
光棍节特惠!SY-STM32F407开发板原价358元,现价318元!!
在线时间101 小时
TA的帖子TA的资源
一粒金砂(高级), 积分 232, 距离下一级还需 268 积分
一粒金砂(高级), 积分 232, 距离下一级还需 268 积分
SY-STM32F407 V2.0开发板板载资源如下:
◆& & 1个以太网接口,HR911105A+DM9161
◆& & CPU:STM32F407VGT6,ARM Cortex-M4内核,1Mbyte Flash和192+4Kbyte SRAM,最高工作时钟168MHz,100脚
◆& & 标准ARM 20PINJTAG/SWD调试下载口
◆& & 1个电源指示灯(红色)&&
◆& & 2个用户指示灯(绿色)
◆& & 1个红外接收头(HS1838)预留接口
◆& & 1个IIC接口的EEPROM芯片,24C02,容量256字节
◆& & 1个SPI FLASH芯片,W25Q16,容量为2M字节
◆& & 1个DS18B20/DS1820温度传感器预留接口
◆& & 1个标准的TFT模块接口,支持1.8/2.4/2.8/3.0寸TFT模块,支持触摸屏
◆& & 1个扩张模块接口,支持MP3模块、收音机模块、九轴模块、以太网模块
◆& & USB OTG接口
◆& & 1个Micro SD卡(TF卡)接口,自弹出式卡座
◆& & 2路RS232接口
◆& & 1路CAN接口预留接口&&
◆& & 1路RS485接口
◆& &IIS音频Line Out
◆& &1个摄像头模块接口,支持OV7660/OV7670/OV7725/OV2640
◆& &1个五向开关
◆& & 1路10K可调ADC
◆& & 1个2.4G(RF24L01)无线通信接口
◆& & 1个复位按钮,可用于整个系统复位
◆& & 2个功能按钮
◆& & 可选外接5V电源或USB或JTAG三种供电模式
◆& & 所有IO口全部引出
二、开发板特点
◆&&小巧。整个板子尺寸为10cm*10cm
◆&&灵活。板上所有的IO口全部引出
◆&&资源丰富,板载二十多种外设及接口。
◆&&教程齐全,各个实例代码均有详细注释!
四、产品包装◆SY-STM32F407 V2.0开发板一块◆2.4寸TFT模块一块 ,带触摸屏
◆MINIUSB 电缆一根
◆跳线帽一些
优惠只有今天!走过路过不要错过!
在线时间912 小时
威望3983分
芯币15614枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3983, 距离下一级还需 2017 积分
五彩晶圆(中级), 积分 3983, 距离下一级还需 2017 积分
给个连接?
在线时间2339 小时
威望10132分
E金币509枚
TA的帖子TA的资源
那么哪里可以买得到呢?
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWORLD 官方微信
EE福利 唾手可得
Powered by 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
STM32和OV2640的嵌入式图像采集系统设计-论文
下载积分:3000
内容提示:STM32和OV2640的嵌入式图像采集系统设计-论文
文档格式:PDF|
浏览次数:50|
上传日期: 23:01:24|
文档星级:
全文阅读已结束,如果下载本文需要使用
 3000 积分
下载此文档
该用户还上传了这些文档
STM32和OV2640的嵌入式图像采集系统设计-论文
官方公共微信用户名:zz_yun
文章数:565
评论数:158
访问量:2343983
注册日期:
阅读量:1297
阅读量:3317
阅读量:447772
阅读量:1132889
51CTO推荐博文
&昨天调试了USART6的DMA工作模式,今天补发上这篇笔记。
力求简洁,stm32的DMA就不介绍了,不了解的可以搜索一下。这里重点介绍一下DMA的外设地址如何确定,这个是网上很少涉及但是很重要的一块,如果不清楚如何确定外设寄存器地址就无法进行DMA功能,这里以stm32F407的USART6为例介绍,参考手册为&RM0090&Reference&manual&。
在进行DMA参数配置时有这样一项&DMA_InitStructure.DMA_PeripheralBaseAddr&=&?;这句是要确定Memory与Peripheral数据传输时的外设数据地址,因为这里我们用到的是USART6从Memory的数组中取出数据并发送给上位机,所以这里用到的外设地址其实是USART6的数据寄存器地址&USART6_DR,关键是确定他的地址。好了我们现在打开参考手册,找到&Memory&Map&一项,650) this.width=650;" alt="stm32F407之USART6的DMA工作方式 - 小枣年糕 - 小枣年糕" src="http://b./space/pic/item/ac6eddc451da81cbd.jpg" style="border-top-width: 0 border-right-width: 0 border-bottom-width: 0 border-left-width: 0 border-style: border-color: margin-bottom: 8 clear: max-width: 758 vertical-align: " />
打开可以看到USART6的基地址为0x,好了,接着点击后面的蓝色连接
650) this.width=650;" alt="stm32F407之USART6的DMA工作方式 - 小枣年糕 - 小枣年糕" src="http://c./space/pic/item/b3b7d0a20cf431adacaf2fdd98a7.jpg" style="border-top-width: 0 border-right-width: 0 border-bottom-width: 0 border-left-width: 0 border-style: border-color: margin-bottom: 8 clear: max-width: 758 vertical-align: " />
看到USART_DR的OFFSET地址为0x04,则USART6的真实地址为&0xx04&=&0x;这样便确定了USART6_DR的地址。其他的就好说了,代码如下
/************************************************************
Copyright&(C),&,&yin.
FileName:&main.c
Author:&ycw&Version&:&1.0&Date:&
Description:&USART6&DMA&SendData&
Version:&V3.0&
Function&List:USART6&DMA&SendData&
History:&V1.0&
&author&&&time&&&version&&&&desc&
YCW&12/04/27&1.0&build&this&moudle
***********************************************************/
#include&stm32f4xx.h&
/*定义USART6的数据寄存器地址,DMA功能要用到外设的数据地址
*USART6的数据地址为外设基地址+偏移地址,基地址在RM0090&Reference
*manual(参考手册)的地址映射表里(P50),为0x,USART_DR
*偏移地址在P657,为0x04,故实际地址为0xx04&=&0x&*/
#define&USART6_DR_Addr&0x
/*定义一个数组,DMA工作时从内存取数组的数据传给USART6&*/
uint8_t&Buffer[]&=&{0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
uint8_t&Buffer2[]&=&{0x99,0x6f};
void&GPIO_Config(void);
void&USART_Config(void);
void&USART6_Puts(char&*&str);
void&DMA_Config(void);
void&NVIC_Config(void);
void&Delay(uint32_t&nCount);
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c&。
程序运行起始于启动文件的第175行(LDR&R0,&=SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M&*/
GPIO_Config();
USART_Config();
DMA_Config();
NVIC_Config();
GPIO_SetBits(GPIOG,&GPIO_Pin_6);&//关闭LED
USART_DMACmd(USART6,&USART_DMAReq_Tx,&ENABLE);&//使能USART6的发送数据DMA请求,至此USART6与DMA开始工作
/*因为DMA工作是独立于CPU之外的,所以在DMA工作的同时CPU可以做其他事
*我们等到DMA传输完毕后产生一个状态指示,即点亮一个LED&*/
/*查询模式
while&(DMA_GetFlagStatus(DMA2_Stream6,&DMA_FLAG_TCIF6)&==&RESET)
GPIO_ResetBits(GPIOG,GPIO_Pin_6);&//点亮LED
//DMA_Cmd(DMA2_Stream6,&DISABLE);&//DMA传输完毕后会自动关闭通道,这句可以不写
/*************************************************
Function:&void&GPIO_Config(void)&
Description:&GPIO配置函数&
Input:&无&
Output:无&
Return:无&
*************************************************/&
void&GPIO_Config(void)
/*定义了一个GPIO_InitStructure的结构体,方便一下使用&*/
GPIO_InitTypeDef&GPIO_InitS
/*&初始化GPIOG时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG&,&ENABLE);//使能GPIOG时钟(时钟结构参见&stm32图解.pdf&)
/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)
*来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他
*成员的值(多为缺省值)被正确填入。
GPIO_StructInit(&GPIO_InitStructure);
/*&初始化GPIOG的Pin_6为推挽输出*/
GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_6;&//指定第六引脚
GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_OUT;&//模式为输出
GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;&//频率为快速
GPIO_Init(GPIOG,&&GPIO_InitStructure);&//调用IO初始化函数
/*************************************************
Function:&void&USART_Config(void)&
Description:&USART配置函数&
Input:&无&
Output:无&
Return:无&
*************************************************/&
void&USART_Config(void)
GPIO_InitTypeDef&GPIO_InitS
USART_InitTypeDef&USART_InitS
USART_ClockInitTypeDef&USART_ClockInitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,&ENABLE);&//开启USART6时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,&ENABLE);&//开启GPIOC时钟
GPIO_PinAFConfig(GPIOC,&GPIO_PinSource6,&GPIO_AF_USART6);//这相当于M3的开启复用时钟?只配置复用的引脚,
GPIO_PinAFConfig(GPIOC,&GPIO_PinSource7,&GPIO_AF_USART6);//&
/*配置GPIOC*/
GPIO_StructInit(&GPIO_InitStructure);&//缺省值填入
/*配置GPIOC_Pin6为TX输出*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;&//设置为复用,必须为AF,OUT不行
GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*配置GPIOC_Pin7为RX输入*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;&//这也必须为复用,与M3不同!
GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*IO引脚复用功能设置,与之前版本不同*/
/*配置USART6*/
USART_StructInit(&USART_InitStructure);
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_N
USART_InitStructure.USART_Mode&=&USART_Mode_Rx&|&USART_Mode_Tx;
USART_Init(USART6,&&USART_InitStructure);
USART_ClockStructInit(&USART_ClockInitStruct);&//之前没有填入缺省值,是不行的
USART_ClockInit(USART6,&&USART_ClockInitStruct);
USART_ITConfig(USART6,&USART_IT_RXNE,&ENABLE);&//使能&USART6中断
USART_Cmd(USART6,&ENABLE);&//使能&USART6&
//USART_DMACmd(USART6,&USART_DMAReq_Tx,&ENABLE);&//使能USART6的发送数据DMA请求,至此USART6与DMA开始工作,可以写在主函数里随时工作
void&NVIC_Config()
/*USART6中断配置*/
NVIC_InitTypeDef&NVIC_InitS
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);&//嵌套优先级分组为&1
NVIC_InitStructure.NVIC_IRQChannel&=&USART6_IRQn;&//嵌套通道为USART6_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&0;&//抢占优先级为&0
NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&0;&//响应优先级为&0
NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;&//通道中断使能
NVIC_Init(&NVIC_InitStructure);
/*DMA中断配置*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);&//嵌套优先级分组为&1
NVIC_InitStructure.NVIC_IRQChannel&=&DMA2_Stream6_IRQn;&//嵌套通道为DMA2_Stream6_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&1;&//抢占优先级为&1
NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&0;&//响应优先级为&0
NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;&//通道中断使能
NVIC_Init(&NVIC_InitStructure);
/*************************************************
Function:&void&USART6_Puts(char&*&str)&
Description:&USART6发送数据&
Input:&待发送数据指针&
Output:无&
Return:无&
*************************************************/
void&USART6_Puts(char&*&str)
while&(*str)
USART_SendData(USART6,&*str++);
/*&Loop&until&the&end&of&transmission&*/
while&(USART_GetFlagStatus(USART6,&USART_FLAG_TXE)&==&RESET);&//详见英文参考的521页,当TXE被置起时,一帧数据传输完成
/*************************************************
Function:&void&DMA_Config(void)&
Description:&DMA配置函数&
Input:&延时的时间&
Output:无&
Return:无&
*************************************************/
void&DMA_Config(void)
DMA_InitTypeDef&DMA_InitS
/*首先开DMA2时钟,由407参考手册-RM0090-Reference&manual
165页可知,UASRT6与DMA2映射,而且DMA2挂载在AHB1时钟总线上*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,&ENABLE);
/*由RM0090-Reference&manual第165页映射表可知,USART6映射在
Channel_5的Stream6和Stream7上,在这里可以选择Stream6&*/&
DMA_DeInit(DMA2_Stream6);
DMA_StructInit(&&DMA_InitStructure);
DMA_InitStructure.DMA_Channel&=&DMA_Channel_5;&//选择Channel_5
DMA_InitStructure.DMA_PeripheralBaseAddr&=&USART6_DR_A&//数据传输的外设首地址,详解见上
DMA_InitStructure.DMA_Memory0BaseAddr&=&(uint32_t)B&//自己定义待发送数组的首地址,要强制转换为32位
DMA_InitStructure.DMA_DIR&=&DMA_DIR_MemoryToP&//数据传输方向选择为内存-&外设
DMA_InitStructure.DMA_BufferSize&=&8;&//传输数据大小为8,单位由以下确定,大小要配合定义的数组类型和外设数据类型
DMA_InitStructure.DMA_PeripheralInc&=&DMA_PeripheralInc_D&//外设地址寄存器自动增加禁止,因为这里只用到了DR数据寄存器
DMA_InitStructure.DMA_MemoryInc&=&DMA_MemoryInc_E&//内存地址自增允许,因为要读取一个数组
DMA_InitStructure.DMA_PeripheralDataSize&=&DMA_PeripheralDataSize_B&//外设的数据大小,因为USART6_DR数据寄存器为8为,故选Byte
DMA_InitStructure.DMA_MemoryDataSize&=&DMA_MemoryDataSize_B&//这里也选Byte
DMA_InitStructure.DMA_Mode&=&DMA_Mode_N&//DMA传输模式为Normal,如果为Circular,将会循环传输
DMA_InitStructure.DMA_Priority&=&DMA_Priority_H&//优先级为High
/*双缓冲模式,在DMA_Init之前调用在Circular模式有效,会强制Circular,
*不支持Memory&toMemory,(uint32_t)Buffer2为DMA_Memory_1,DMA先将Buffer
*中的数据发送完毕后在发送Buffer2的数据,当然顺序可以改变
DMA_DoubleBufferModeConfig(DMA2_Stream6,&(uint32_t)Buffer2,&DMA_Memory_0);
DMA_DoubleBufferModeCmd(DMA2_Stream6,&ENABLE);
DMA_Init(DMA2_Stream6,&&DMA_InitStructure);
DMA_Cmd(DMA2_Stream6,&ENABLE);&//使能DMA2_Stream6通道
/*DMA中断开*/
DMA_ITConfig(DMA2_Stream6,&DMA_IT_TC,&ENABLE);
/*************************************************
Function:&void&Delay(uint32_t&nCount)&
Description:&延时函数&
Input:&延时的时间&
Output:无&
Return:无&
*************************************************/
void&Delay(uint32_t&nCount)
while&(nCount--);
中断服务函数:
/**名称:DMA中断服务程序
*作用:DMA数据完全完成后产生中断,并点亮LED
void&DMA2_Stream6_IRQHandler(void)
if&(DMA_GetITStatus(DMA2_Stream6,&DMA_IT_TCIF6)&!=&RESET)&//判断为接收中断
DMA_ClearITPendingBit(DMA2_Stream6,&DMA_IT_TCIF6);
GPIO_ResetBits(GPIOG,&GPIO_Pin_6);&//点亮LED,起到中断指示作用
调试结果如下:
650) this.width=650;" alt="stm32F407之USART6的DMA工作方式 - 小枣年糕 - 小枣年糕" src="http://d./space/pic/item/d1a20cf431adcbefddc083afacaf2edda2cc9fa7.jpg" style="border-top-width: 0 border-right-width: 0 border-bottom-width: 0 border-left-width: 0 border-style: border-color: margin-bottom: 8 clear: max-width: 758 vertical-align: " />
了这篇文章
类别:┆阅读(0)┆评论(0)现在的位置:
STM32F4 DISCOVERY入手——功耗大解密
在如今能源紧张的时代,如果才能够更加“省电”一直是各大MCU制造公司关注的重点。在不断提高性能的同时,系统功耗也在不断的降低。作为一款工控领域的M4内核的信号处理MCU,其功耗也一定有过人之处。
首先让我们请出今天测试的主角: DISCOVERY 评估板,关于这款评估板的详细介绍可以参考前面的。除了主角外,一场戏要完美谢幕,配角当然也必不可少。
最先登场的是优利德37014稳压电源,其包含2路可调0~32V电压输出以及一路5v固定输出的电压输出,其波纹可低至1mv。
第二件是胜利VC9808,虽然这块表比不上FLUKE等神器,但经过校验其精度和量程还是能够保证的。特别是它的电流量程可低至2mA,电压量程可低至200mV。
第三件是一个组合。它包含有三个高精度的表头,从左到右的量程依次是10uA,50uA,100uA。如今的MCU在某些特殊的低功耗模式下消耗的电流一般都是uA级别的,所以用这些刚好合适。虽然这些设备与专业的实验室里那些动辄几十万甚至上百万的仪器还有不小的差距,但这也恰好符合日常的工作环境。在大部分情况下,用这些“小米+步枪“完成的测试结果还是比较准确和可靠的。:)
一般来说,降低系统的功耗的方式主要有降低核心工作电压,关闭各种无关外设和部分核心等等方法。通过查阅系列MCU的手册,我们可以看到STM32 MCU包含了四种低功耗模式,其中就有5uA STOP停止模式以及0.2uA待机模式(RTC运行),并且其工作的电压范围可宽至2.0v~3.6v。下图来自系列用户手册,它告诉我们如何进入各种模式,以及在各个模式下如何唤醒。
俗话说耳听为虚眼见为实,下面就让我们来实际测试一下系列的功耗。
1. 首先让我们来看看的最低工作电压。根据手册其可最低到1.8V,在某些特殊的封装还可以低至1.7V。测试电路很简单,首先用稳压电源输出电压,我们可以看到在3.3V输出的情况下,开发板工作一切正常,4个彩色LED灯也依次闪烁。
下面我们慢慢降低工作电压,随着电压的降低,4LED灯的亮度也逐渐降低,但依然有次序的闪烁,表示目前工作依然正常。当电压降低至2.1V时,板子上的指示灯完全熄灭。
缓慢升高电压,当到达2.1V时,系统重新开始工作,由于稳压电压只能精确到0.1V,所以此时查看电压表,表头显示为2.09V.这也就是 DISCOVERY 评估板的最低工作电压了。虽然2.09V比手册上描写的1.7V还有不小的差距,但考虑到整块DISCOVERY 评估板上除了MCU以及其它器件,2.09V的工作电压已经很不错了。况且,在平时设计的产品中,也不太可能只有一个MCU吧。
文章分页: 1
【上篇】【下篇】
您可能还会对这些文章感兴趣!
您必须才能发表留言!【MCU实战经验】STM32F407的串口编程经验 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 18230|回复: 0
【MCU实战经验】STM32F407的串口编程经验
在线时间24 小时
主题帖子好友
中级会员, 积分 396, 距离下一级还需 104 积分
中级会员, 积分 396, 距离下一级还需 104 积分
串口是嵌入式开发中最常前的外设设备,既可以用作不同单片机之间的通信,也可以用作在 MCU和PC机之间的通信,的串口功能非常强大,可以接红外,可以接流控,也可以接SIM卡接口,但我这里只介绍我们最常用的UART通信的一点调试经验,以STM32F407为例,对其它STM32芯片也适用,希望对大家有所帮助,如有错误不当之处欢迎大家联系指正。
一、串口的三种工作方式
操作串口一般有两种方式:查询和中断;STM32还支持第三种方式。
(1)查询:串口程序不断地循环查询标志,看看当前有没有数据要它传送或接收。如果有的话进行相应的写操作和读操作进行传送或接收数据。
(2):平时串口只要打开中断即可。如果发现有一个中断来,则意味着有数据需要接收(接收中断)或数据已经发送完成(发送中断)。
(3)DMA方式,设置好DMA工作方式,由DMA来自动接收或发送数据。
一般来说,查询方式的效率是比较低的,并且由于STM32的UART硬件上没有FIFO,如果程序功能比较多,查询不及时的话很容易出现数据丢失的现象, 故实际项目中这种方式用的并不多。
中断方式的话我们可以分别设置接收中断和发送中断,当串口有数据需要接收时才进入中断程序进行读读操,这种方式占用CPU资源比较少,实际项目中比较常用,但需要注意中断程序不要太复杂使执行时间太长,如果执行时间超过一个字符的时间的话也会出现数据丢失的现象,这个波特率比较高的串口编程中比较容易出现,可以考虑用循环BUF方法,在中断程序中只负责实时地接收实数数和发送时的填数(写发送寄存器),其它操作放在中断外处理。
STM32还提供了第三种DMA方式用来支持高速地串口传输。这种方式只要设置好接收和发送缓冲位置,可以由DMA来自动接收和发送数据,这可以最小化占用CPU时间。
二、串口的使用步骤
(1)中断方式
基本步骤是初试化时钟,脚位、波特率设置、安装中断服务程序、开中断等,参考代码如下:
void uart_init(void)
{
& &USART_InitTypeDef USART_InitS
&&NVIC_InitTypeDef NVIC_InitS
&&GPIO_InitTypeDef&&GPIO_InitS
& &
&&/* Enable GPIO clock&&*/
& &RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
&&
& &/* Enable USART clock */
& &RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
&&
& &/* Connect USART pins to AF7 */
& &GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
&&GPIO_PinAFConfig(GPIOC, GPIO_PinSource11,&&GPIO_AF_USART3);
& &
&&/* Configure USART Tx and Rx as&&alternate function push-pull */
& &GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&GPIO_InitStructure.GPIO_Speed =&&GPIO_Speed_100MHz;
& &GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd =&&GPIO_PuPd_UP;
& &GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
&&GPIO_Init(GPIOC,&&&GPIO_InitStructure);
& &
&&GPIO_InitStructure.GPIO_Pin =&&GPIO_Pin_11;
&&GPIO_Init(GPIOC,&&&GPIO_InitStructure);
&&/*&&USARTx configuration&&----------------------------------------------------*/
&&/* USARTx configured as follow:
& && &&&- BaudRate = 3750000 baud
&&- Maximum BaudRate that can be achieved when&&using the Oversampling by 8
& &&&is: (USART APB Clock / 8)
& &- (USART3 APB1&&Clock / 8) = (30 MHz / 8) = 3750000 baud
& &- (USART1 APB2 Clock / 8) = (60 MHz / 8) = 7500000&&baud
&&- Maximum BaudRate that can&&be achieved when using the Oversampling by 16
& & is: (USART APB Clock / 16)
Example: (USART3 APB1 Clock / 16) = (30 MHz / 16)&&= 1875000 baud
Example: (USART1&&APB2 Clock / 16) = (60 MHz / 16) = 3750000 baud
& && &&&- Word Length = 8 Bits
& && &&&- one Stop Bit
& && &&&- No parity
& && &&&- Hardware flow control disabled (RTS and&&CTS signals)
& && &&&- Receive and&&transmit enabled
& &*/
& &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_N
& &USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
&&USART_Init(USART3,&&&USART_InitStructure);
& &
&&/* NVIC configuration&&*/
&&/* Configure the Priority&&Group to 2 bits */
& &NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
&&
& &/* Enable the USARTx Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
& &NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority =&&0;
& &NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& &NVIC_Init(&NVIC_InitStructure);
&&
&&/* Enable USART&&*/
&&USART_Cmd(USART3,&&ENABLE);
&&USART_ITConfig(USART3,&&USART_IT_RXNE, ENABLE);
}
复制代码
中断服务程序如下:
void USART3_IRQHandler(void)
{
&&
if(USART_GetITStatus(USART3,&&USART_IT_RXNE) != RESET)
& &{
& & /* Read one byte from the&&receive data register */
& & ch =&&(USART_ReceiveData(USART3));
& &&&printf(&in[%c].\r\n&,ch);
&&}& &
直接把接收到的字符打印出来。
(2)DMA方式
基本步骤同中断方式,额外需要DMA的初始化配置,参考代码如下:
void&&uart_init(void)
{
&&USART_InitTypeDef&&USART_InitS
& &NVIC_InitTypeDef NVIC_InitS
&&GPIO_InitTypeDef GPIO_InitS
&&DMA_InitTypeDef DMA_InitS
&&
& &/* Enable GPIO clock */
& &RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
&&
& &/* Enable USART clock */
& &RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
&&
& &/* Connect USART pins to AF7 */
& &GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
&&GPIO_PinAFConfig(GPIOC, GPIO_PinSource11,&&GPIO_AF_USART3);
& &
&&/* Configure USART Tx and Rx as&&alternate function push-pull */
& &GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&GPIO_InitStructure.GPIO_Speed =&&GPIO_Speed_100MHz;
& &GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd =&&GPIO_PuPd_UP;
& &GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
&&GPIO_Init(GPIOC,&&&GPIO_InitStructure);
& &
&&GPIO_InitStructure.GPIO_Pin =&&GPIO_Pin_11;
&&GPIO_Init(GPIOC,&&&GPIO_InitStructure);
&&/*&&USARTx configuration&&----------------------------------------------------*/
&&/* USARTx configured as follow:
& && &&&- BaudRate = 3750000 baud
&&- Maximum BaudRate that can be achieved when&&using the Oversampling by 8
& &&&is: (USART APB Clock / 8)
& &- (USART3 APB1&&Clock / 8) = (30 MHz / 8) = 3750000 baud
& &- (USART1 APB2 Clock / 8) = (60 MHz / 8) = 7500000&&baud
&&- Maximum BaudRate that can&&be achieved when using the Oversampling by 16
& & is: (USART APB Clock / 16)
Example: (USART3 APB1 Clock / 16) = (30 MHz / 16)&&= 1875000 baud
Example: (USART1&&APB2 Clock / 16) = (60 MHz / 16) = 3750000 baud
& && &&&- Word Length = 8 Bits
& && &&&- one Stop Bit
& && &&&- No parity
& && &&&- Hardware flow control disabled (RTS and&&CTS signals)
& && &&&- Receive and&&transmit enabled
& &*/
& &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_N
& &USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
&&USART_Init(USART3,&&&USART_InitStructure);
/*&&DMA_Configuration */
& &DMA_DeInit(DMA1_Stream1);
& &
&&DMA_InitStruct.DMA_Channel =&&DMA_Channel_4;& &
& &DMA_InitStruct.DMA_PeripheralBaseAddr =&&(u32)&USART3-&DR; //source&&buf
& &DMA_InitStruct.DMA_Memory0BaseAddr = (u8) //target buf
&&DMA_InitStruct.DMA_DIR =&&DMA_DIR_PeripheralToM
& &DMA_InitStruct.DMA_BufferSize =&&//BuffS
&&DMA_InitStruct.DMA_PeripheralInc =&&DMA_PeripheralInc_D
& &DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_E
&&DMA_InitStruct.DMA_PeripheralDataSize =& &DMA_PeripheralDataSize_W
& &DMA_InitStruct.DMA_MemoryDataSize =&&DMA_MemoryDataSize_B
&&DMA_InitStruct.DMA_Mode = DMA_Mode_C&&//DMA_Mode_N
& &DMA_InitStruct.DMA_Priority = DMA_Priority_H
&&DMA_InitStruct.DMA_FIFOMode =&&DMA_FIFOMode_D
& &DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfF
&&DMA_InitStruct.DMA_MemoryBurst =&&DMA_MemoryBurst_S
& &DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_S
&&DMA_Init(DMA1_Stream1,&&&DMA_InitStruct);
&&/* NVIC configuration&&*/
&&/* Configure the Priority&&Group to 2 bits */
& &NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
&&
& &/* Enable the USARTx Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn;&&
& &NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority =&&0;
& &NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);&&
&&/* Open DMA&&interrupt*/
& &DMA_ITConfig(DMA1_Stream1, DMA_IT_TC, ENABLE);
&&DMA_Cmd(DMA1_Stream1, ENABLE);
&&USART_Cmd(USART3, ENABLE);
& &USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);
}复制代码
DMA中断服务程序如下:
void DMA1_Stream1_IRQHandler(void) //UART3_RX
{
& &&&
& & //When a&&Transfer Complete
if(SET ==&&DMA_GetITStatus(DMA1_Stream1, DMA_IT_TCIF1))
{
DMA_ClearITPendingBit(DMA1_Stream1, DMA_IT_TCIF1);
i++;
}
}复制代码
上面程序只配了DMA接收,发送类似。
三、实现DMX512协议
DMX512 协议是美国剧场技术协会( United States Institute for Theater Technology,&&USITT) 制定的数字多路复用协议, 其制定的初衷是为了使舞台、剧场等地所使用的众多的调光器和控制器能相互兼容。虽然它不是一个行业或国家标准, 但是由于它的简单性和实用性, 自从出台以来, 得到了世界各地生产商和使用者普遍承认,这个协议在LED控制方面应用很广泛,利用STM32 USART可以高速传输的特性,我们很容易用STM32来实现DMX512协议。
(1)数据的格式及传输
DMX512&&协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个数据包由若干数据帧组成, 每帧数据包括1 位低电平起始位、8 位数据位和2 位高电平停止位。DMX 协议要求数据传输的波特率为250kb/s, 亦即每位的传输时间为4us, 每帧数据的传输时间为44us, 它支持多达512 帧数据传输, 每帧数据与相应的控制支路相对应。数据包的传送要符合一定的格式和时序要求。为了使接收器能够分辨出第一帧数据, 每一个数据包以一个不短于88us 的低电平信号为起始信号, 即所谓的“Break”信号, 接收器接收到“Break”信号就准备接受随后而来的数据帧; 紧接着“Break”信号之后是不短于8us 的高电平信号M. a. b ( Mark after&&Break) ; 之后就是数据帧。在DMX512 协议中, M. a. b 之后的第一帧数据被称
为“Star-t code”, 在协议中规定其为零, 但在实际应用中可以由生产厂家自己确定其具体的值,&&以传递特殊消息。“Star-t&&code”标明其后面的数据是8&&位控制信号数据帧。数据帧之间可以有时间间隔, 也可以没有;&&同样, 数据包之间可以有时间间隔, 也可以没有。DMX512 协议规定“Break”信号、M. a. b 信号的最短时间, 并规定“Break”信号、M. a. b 信号、
数据帧之间及数据包之间的时间间隔的最大值不得超过1s, 否则做出错处理, 但是DMX512 协议并未对出错处理做任何规定。为了严格实现DMX512&&数据的时序要求,“Break”和M.&&a. b信号我们可以用定时器来实现。
具体的UART配置如下:
&&USART_InitStructure.USART_BaudRate =&&250000;
& &USART_InitStructure.USART_WordLength = USART_WordLength_8b;
&&USART_InitStructure.USART_StopBits =&&USART_StopBits_2;
& &USART_InitStructure.USART_Parity = USART_Parity_No;
&&USART_InitStructure.USART_HardwareFlowControl =&&USART_HardwareFlowControl_N
& &USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
&&USART_Init(USART1,&&&USART_InitStructure);复制代码
发送DMX512信号过程如下,先把UART的TX脚配置为普通的GPIO并输出低电平,然后启动定时器计时88us,&&时器到后把TX脚置为高电平并计时8us, 时器到了后在配为UART模式用DMA方式把数据发出。
DMX512信号的接收是个难点,一般直接配为UART接收就行,不需要在UART模式和GPIO模式间切换,但需要在接收过程中检查接收到“Break”信号时的状态是有帧错误出现,并且接收数据全为零,这样的话可以确认已经收到“Break”信号,随后数据正常DMA接收就行了。
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by}

我要回帖

更多关于 stm32外设 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信