|
7 F5 f* B) [& O$ k 一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯 ) Y4 q/ V3 W' {$ M. @. M5 X 本教程的主角是:串口 UART 6 V2 x _5 o: t( G8 r. W& J+ q& g 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 5 ~: R( x L. j$ @; @ 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 6 p9 Z! U! m. c/ T) R! G, a 1 F/ X" Z4 x/ l. ]6 R 主要特性: 全双工的,异步通信 + a! P: Z3 u) W; n1 @9 c NR 标准格式 " M {+ x# j7 Y 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) 5 J1 Y% }% _6 A$ B6 g7 U' k& P 可配置的停止位 -支持1或2个停止位 LIN主发送同步断开符的能力以及LIN从检测断开符的能力 - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 2 G h5 B) ~8 s" V8 x! _5 h( k 发送方为同步传输提供时钟 IRDA SIR 编码器解码器 1 K& M, X9 x8 T - 在正常模式下支持3/16位的持续时间 智能卡模拟功能 - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 % \9 b3 K; y7 C' L: ^% e - 智能卡用到的0.5和1.5个停止位 ' n6 K) ]1 f' v- ? 单线半双工通信 使用DMA的可配置的多缓冲器通信 - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 单独的发送器和接收器使能位 ' ?, M" K9 w$ D1 y 检测标志 - 接收缓冲器满 - 发送缓冲器空 - 传输结束标志 2 m" @8 q! V! S, G% j( T+ D 校验控制 ?( A7 N6 A8 I1 _1 e - 发送校验位 4 F A0 n. Q9 P - 对接收数据进行校验 四个错误检测标志 ; l3 i0 b+ {+ I' T2 r" a( Y. ` - 溢出错误 - 噪音错误 - 帧错误 : B n) n- n2 d+ ^ - 校验错误 10个带标志的中断源 $ P1 z" S4 q- a8 _7 }- D- G! X: U - CTS改变 % e2 m d- O# S' u/ G {5 F- e0 U - LIN断开符检测 - 发送数据寄存器 - 发送完成 ) {: `4 M" p& f, Q% ` - 接收数据寄存器 - 检测到总线为空 - 溢出错误 - 帧错误 - 噪音错误 - 校验错误 多处理器通信 - - 如果地址不匹配,则进入静默模式 从静默模式中唤醒(通过空闲总线检测或地址标志检测) 两种唤醒接收器的方式 - 地址位(MSB) - 空闲总线 $ _' H/ _; h# v5 a [/td] [/tr] [tr] [td]( [0 V/ k: T8 S Q3 X2 M$ k& e4 t 6 v' v3 {; @9 O! t STM32的串口配置 也挺方便的 : U: ]8 z4 Y9 H8 g. }6 }( p 首先是配置UART的GPIO口 /*******************************************************************************) R% J) f; H: u1 _- S$ n5 d * Function Name : UART1_GPIO_Configuration3 E i2 y2 a0 t4 K" c * Description : Configures the uart1 GPIO ports.8 g# ?/ S& G& T * Input : None2 Y6 k2 y+ M. L. j+ t; V" S * Output : None/ g# K) R2 F5 T6 } * Return : None *******************************************************************************/ void UART1_GPIO_Configuration(void)' J0 ^) Z& b8 f/ p+ T7 P1 B { GPIO_InitTypeDef GPIO_InitStructure; // Configure USART1_Tx as alternate function push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; k, p" w/ Q1 y2 F7 Z' d' e; ]3 I GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;* ~+ B/ T$ `: x: [ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;' V4 S2 r( L# v0 n" [- q6 ] GPIO_Init(GPIOA, &GPIO_InitStructure);: p* @$ H! x" @0 W0 a/ y # Y! {1 `9 {( W( ~% h. C/ ^ // Configure USART1_Rx as input floating " a* W; D" j9 } GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;, D( c- ~7 c3 I7 U9 N GPIO_Init(GPIOA, &GPIO_InitStructure); } 然后是配置串口参数 /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 如果需要使用中断的方式发送和接收数据 则需要使能串口中断" B6 |3 A- k, w& y; J n7 V) p 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) ( l! H& n7 _& W' I$ @* j 功能描述 使能或者失能指定的 USART 中断 / m& ?5 P' x3 u1 D USART_IT 描述 USART_IT_PE 奇偶错误中断 9 o$ p+ k# d4 z9 u3 K F$ b USART_IT_TXE 发送中断 USART_IT_TC 传输完成中断 9 A( z) V5 a/ B6 v: |% ?+ { USART_IT_RXNE 接收中断 USART_IT_IDLE 空闲总线中断 USART_IT_LBD LIN中断检测中断 USART_IT_CTS CTS中断 $ D+ F+ }3 }( `! s9 ? USART_IT_ERR 错误中断 */0 P* S* L+ Z) Z5 ^; p+ d9 y 4 D: S; {# c- [' W% A /*******************************************************************************. Q& ]+ R% ~- o/ N$ p * Function Name : UART1_Configuration$ n, b c% O( Z. G8 n: ]7 I5 f+ T * Description : Configures the uart1 * l% K; A2 i- E4 F * Input : None * Output : None * Return : None *******************************************************************************/3 y0 c a2 Q0 B. J6 c5 I. _9 F void UART1_Configuration(void) {6 X0 }) k1 w' I# X" ]. ^5 t USART_InitTypeDef USART_InitStructure; /* USART1 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled0 V$ d2 S7 C2 L3 b */! }- U r8 a7 _& I* Q8 s3 Q USART_InitStructure.USART_BaudRate = 9600;/ ?+ h3 \, u! D N2 F' R5 ~ USART_InitStructure.USART_WordLength = USART_WordLength_8b;' M2 ^8 |9 l" V# A h) }) Z, B P USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ;8 }) S9 A$ a- w0 v9 d- v USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* Configure the USART1*/ USART_Init(USART1, &USART_InitStructure);8 c# |3 R4 q5 O /* Enable USART1 Receive and Transmit interrupts */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);! B; q+ n0 E: ] 2 x; j* O8 t7 q. C7 N 6 v" f! S4 p( ~0 S9 Y' R! i- ^ /* Enable the USART1 */ USART_Cmd(USART1, ENABLE); }" b2 A7 Y2 o; I' } 8 z% F% d: v' D. y3 T9 Q" b0 g' A( v, Y [/td] [/tr] [tr] [td] 发送一个字符 /*******************************************************************************0 T7 r1 `, `2 U# t' S: b * Function Name : Uart1_PutChar * Description : printf a char to the uart. * Input : None: u& O* ]; z4 T- @' ?* B * Output : None * Return : None2 k1 ]" `% E* ~7 X m6 A *******************************************************************************/ u8 Uart1_PutChar(u8 ch) { /* Write a character to the USART */. c E0 k7 t, N* L F% j USART_SendData(USART1, (u8) ch);, F7 i/ l9 e! A" k$ U. F0 K9 i( i: { while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)" _) |1 n1 P( W3 }: V+ y6 I { } return ch;& f8 j6 D0 ^; p7 m* w- F }% V( V2 D1 e* C# f h2 o% R: v5 d [/td] [/tr] [tr] [td]; }4 l% m L F% i& v) P% o" o <font size="3">发送一个字符串. ~3 P& ]6 j7 A& ~7 J4 J /******************************************************************************* * Function Name : Uart1_PutString * Description : print a string to the uart1: D9 }/ h6 K; q8 D( M ? * Input : buf为发送数据的地址 , len为发送字符的个数 * Output : None * Return : None *******************************************************************************/ void Uart1_PutString(u8* buf , u8 len)+ \7 ]0 ]/ f2 u: p- G! s% B) { {; h6 g2 A/ [' y* M" O for(u8 i=0;i |
STM32L562DK探索板——串口通讯测试成功
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
NUCLEO-H723ZG开发板试用 ——串口点灯测试
MultiButton移植到STM32F103战舰开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
S2LP 的 sniff 模式如何同时满足通讯和低功耗要求
双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证
意法半导体 STHV200超声波 IC单片简化设计
了解NFC技术优势与应用场景
微信公众号
手机版
豆皮 - STM32开发板入门教程(五) - 我的豆皮会唱歌 (原...
呵呵 不是播放MP3啦(顺便说一下 豆皮播放MP3 bozai已经做出来了哦 呵呵 )/ L4 e+ V5 l5 z
是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了) e k# P1 r. G+ h; [
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵 " v6 m( e% v' G8 w
/ t8 a5 g. Q8 v# }3 \$ h
本教程的主角是:STM32 PWM 蜂鸣器
# `0 s- i# f4 \0 p; z! e3 a
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵+ m |8 _- m& z
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵3 B I' S R7 p j
/*******************************************************************************) `/ e7 J" ?4 J+ e; p" P
* Function Name : Change_for_Note
* Description : 修改pwm频率# s- `7 f6 z M
* Input : u16类型的频率值0 o! t) T# a( v! r# W
* Output : None
* Return : None! V# r. |, J; u% W% m0 O
*******************************************************************************/
void Change_for_Note(u16 NoteSet)
{0 _& b7 o& d. c1 J/ u: ~4 A f* |
4 _: s1 H( ]. s4 ] `8 t
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;- a1 l* ~- Y% I+ q
TIM_OCInitTypeDef TIM_OCInitStructure;( Q8 T Z7 ?" l, Y
9 m @5 T3 V/ {! `; b4 |
/* Time base configuration */: A# {) S/ X, I, c( F5 C5 V1 {# j( N7 d
TIM_TimeBaseStructure.TIM_Period = NoteSet; ! L) J& M) X* N
TIM_TimeBaseStructure.TIM_Prescaler = 0;8 p! y3 o3 T: S
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;8 ?6 n# V) l- A9 B: {6 M* T7 [3 C" V
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
4 F- {2 I' l4 `) y
/* PWM1 Mode configuration: Channel4 */! P7 d. d3 k* l g* `; f2 W
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;- e% _; U3 e' y5 l4 j3 H/ w" t
TIM_OC4Init(TIM4, &TIM_OCInitStructure);: C3 N9 `/ O+ X1 L! c8 [" C
} " k7 O( o8 e7 Z5 x0 o
, S; x6 ]+ C8 U3 |4 x5 t! C" R
0 k9 J9 L/ w. {6 Y
[/td] [/tr] [tr] [td]0 v4 R8 y- O3 U9 l. y8 U, w
* J* D" |9 l. t1 Q
<font size="3">/* 取得音高和节拍 奏一个音符 */4 }% p: F( o3 K, k4 }
void Sing_A_Note(int music,int mytime)4 h( g. P4 ~5 p3 h8 W: D
{- o- h5 }4 X- r' u: z: Y( N
! x: b# K6 s0 {* K4 ]: ^0 q
int i;9 o7 s9 A1 j# ~8 p' j$ A3 u) o# {
Change_for_Note(music);
for(i=0;i
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
附件在哪里?
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
C调1= 440 Hz. E5 V' _/ @% `+ ]
然后按12平均率,算出每个音符的频率,
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART