一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯 ' ]8 ?# E7 p+ L; y* v 本教程的主角是:串口 UART # t& S8 s1 U. s! d: t0 p# W 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 6 s* N, o: }/ {! r9 S 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 4 _+ ^ l9 V$ \" I1 T9 `# W2 m 主要特性: 3 A7 S* |2 \! e- b2 ~9 O 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) , C, W- {/ B, N: H& l 可配置的停止位 -支持1或2个停止位 LIN主发送同步断开符的能力以及LIN从检测断开符的能力 - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 发送方为同步传输提供时钟 IRDA SIR 编码器解码器 * j) P+ D3 \& L2 F# W - 在正常模式下支持3/16位的持续时间 智能卡模拟功能 * H# n3 m, }3 W& g' T! M - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 $ P( b* [. @2 j! V) ~' I6 E - 智能卡用到的0.5和1.5个停止位 单线半双工通信 " q3 g/ O T! }9 [2 P 使用DMA的可配置的多缓冲器通信 + h$ j$ z( d- o# E - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 & {7 b u4 c& I4 { F 单独的发送器和接收器使能位 " C; [* s. v+ G! W* V0 T 检测标志 # w* t- I# ~% t3 D9 T% @ - 接收缓冲器满 % B% K% t- r! ~0 l, l9 I - 发送缓冲器空 + Z. W: J' F6 M( P ], ~ - 传输结束标志 - f; d- }% K" L" k+ h- m* y 校验控制 - 发送校验位 - 对接收数据进行校验 ' z! L/ l; v+ M/ E7 v6 p" | 四个错误检测标志 " P: K/ D. b C0 D W8 @/ X9 n# ^ - 溢出错误 - 噪音错误 - 帧错误 + y8 q* Q) T, _ - 校验错误 / T) x1 ]6 R6 d' d9 C% w; k 10个带标志的中断源 - CTS改变 - LIN断开符检测 0 R7 E W" d% S' r0 f7 R8 B, z - 发送数据寄存器 - 发送完成 & `* t* a+ i: k - 接收数据寄存器7 \- s- {: \ Y" O, h - 检测到总线为空 - 溢出错误 - 帧错误 - 噪音错误 - 校验错误 多处理器通信 - - 如果地址不匹配,则进入静默模式 从静默模式中唤醒(通过空闲总线检测或地址标志检测) 两种唤醒接收器的方式 - 地址位(MSB) - 空闲总线 . n) |8 v+ y1 W5 J; P3 l2 H2 k [/td] [/tr] [tr] [td]+ z4 n" i& ^' g ) H; I! a. P5 F$ h8 K STM32的串口配置 也挺方便的 V+ ~+ \. ?/ U) \! ~ 首先是配置UART的GPIO口 /*******************************************************************************# m# U4 Y8 v1 e5 {4 [) n5 g * Function Name : UART1_GPIO_Configuration' P; L: f( d; G& T * Description : Configures the uart1 GPIO ports.0 ~: X9 B3 Z, t! j. B9 D, q * Input : None7 g+ ^2 G' q! g9 |" r) p * Output : None4 B; W" H- t* L. y * Return : None. ?4 T( D4 U' `# P6 L6 o *******************************************************************************/: `7 n, R, Y4 o# A void UART1_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;7 @1 S+ }+ M) k. \ // Configure USART1_Tx as alternate function push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/ a* M* G) R% i% ~3 l GPIO_Init(GPIOA, &GPIO_InitStructure);4 `6 D) ?# F% N# x1 B' D // Configure USART1_Rx as input floating * M1 E- U! c: q, |7 A GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;9 a; @" d( g& M) |) { GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); }7 Q7 F% S D) W4 f6 r8 R 然后是配置串口参数 / C" [. q$ U6 C0 Y /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 如果需要使用中断的方式发送和接收数据 则需要使能串口中断 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) x# y0 R2 `7 @# u' D" M 功能描述 使能或者失能指定的 USART 中断 7 `% q! b; F2 g0 D1 m& V USART_IT 描述6 W# M: {: N$ _$ M9 a USART_IT_PE 奇偶错误中断 B/ |5 z( L. i6 c USART_IT_TXE 发送中断 USART_IT_TC 传输完成中断 USART_IT_RXNE 接收中断 USART_IT_IDLE 空闲总线中断 USART_IT_LBD LIN中断检测中断 USART_IT_CTS CTS中断 . w6 ?8 H k% D v& ]: F7 W USART_IT_ERR 错误中断 */ , d& L: |( z: W1 S5 p, w U1 k/ I7 Z6 b. O /******************************************************************************* * Function Name : UART1_Configuration * Description : Configures the uart1 * Input : None * Output : None * Return : None *******************************************************************************/ void UART1_Configuration(void) {2 H( G: F) x9 @0 K USART_InitTypeDef USART_InitStructure;' f$ ~) I' c: o' G# N /* USART1 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits# q9 }: n0 t# y: Y+ V - One Stop Bit' J: i# j" I+ s' I3 ] p9 L - No parity, M& [# C: o5 E, ^% _8 [ - Hardware flow control disabled (RTS and CTS signals)7 X! b4 ^3 P# x) E7 E7 t - Receive and transmit enabled: x! L, ^. y& c, V, a */$ Z u& H9 q/ V2 M3 {1 o USART_InitStructure.USART_BaudRate = 9600; z, N) y- R! K/ K USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1;. I1 ?3 K k0 {: K1 G8 t USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;6 E/ l% \4 i' X I0 I7 s USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; & h- Z3 l) g( ~! H& e /* Configure the USART1*/ / I% ?% ]+ X4 r USART_Init(USART1, &USART_InitStructure); ' G: Q* R5 s7 S/ [6 L* `' q1 ~/ n /* Enable USART1 Receive and Transmit interrupts */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Enable the USART1 */; N3 j S3 I& h7 o9 A5 v5 a$ i USART_Cmd(USART1, ENABLE); ( P* }$ Z) R2 L }& k0 P9 t* d ~$ F p [/td] [/tr] [tr] [td] 发送一个字符 /*******************************************************************************, h+ Y; s- C! v% \$ J( K * Function Name : Uart1_PutChar * Description : printf a char to the uart.& \& _4 z/ L$ R2 M. o h * Input : None * Output : None * Return : None *******************************************************************************/4 n7 V9 o" w; u, w u8 Uart1_PutChar(u8 ch) {: D+ g! O8 b5 ?( s: H /* Write a character to the USART */( N) N+ A9 M% @$ T8 T, ] USART_SendData(USART1, (u8) ch);4 b7 U& j+ @$ F: e, q while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { }" S& ~$ x' m* y return ch; }, ?/ a" ?5 J! G' p [/td] [/tr] [tr] [td] <font size="3">发送一个字符串 /*******************************************************************************5 G, @5 v5 g2 o6 Z8 F, F8 z * Function Name : Uart1_PutString * Description : print a string to the uart13 d E8 X/ n% G _3 F' e! r2 V * Input : buf为发送数据的地址 , len为发送字符的个数 * Output : None * Return : None *******************************************************************************/5 i/ v' L% J! c1 x' N void Uart1_PutString(u8* buf , u8 len)$ g! F) E+ x$ e& V. o/ l, j) R6 y { for(u8 i=0;i |
豆皮 - STM32开发板入门教程(五) - 我的豆皮会唱歌 (原...
呵呵 不是播放MP3啦(顺便说一下 豆皮播放MP3 bozai已经做出来了哦 呵呵 )
是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符0 u6 @3 R5 |2 _) s7 {2 F
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵 9 {; Z" S' j' a4 g
本教程的主角是:STM32 PWM 蜂鸣器 - U: I) [0 G. v- | R( A! Z* n
3 I$ m4 y2 {% P
p2 X5 s* x& e
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵, ?% ^* g& U1 h" v" [ }+ T
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵
/*******************************************************************************3 h$ m$ }# F, ^: u+ T
* Function Name : Change_for_Note: R4 ~: \6 [& a- Q
* Description : 修改pwm频率7 W- C/ F& d4 w/ p
* Input : u16类型的频率值$ ?- h, d* z5 u6 ^' d# [; X. i
* Output : None
* Return : None( i- {: T* a& k8 c4 n' N$ l
*******************************************************************************/. |$ S2 D0 {: N O" I
void Change_for_Note(u16 NoteSet)
{/ K2 b: [6 G" O9 I& J$ Z
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;0 t- t2 J5 u/ ~
* v2 w# h. p& v0 D
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = NoteSet; # i, t! N6 b) Y' n0 Y
TIM_TimeBaseStructure.TIM_Prescaler = 0;. [8 N6 e, R0 C+ H8 t1 J1 w
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;( ` l- w0 [* ^0 M9 K
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;3 X- C! ]# X. j/ k# v H9 }
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
" m* C% H5 v$ s5 i
/* PWM1 Mode configuration: Channel4 */1 |' l+ G! L. H: R
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;- I! o7 i( y, z- Y! r
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;$ u3 [4 P& I) d, t$ {
TIM_OC4Init(TIM4, &TIM_OCInitStructure);4 ~9 @ w) D" x
}
3 X% z1 h0 J+ q8 R
[/td] [/tr] [tr] [td]
<font size="3">/* 取得音高和节拍 奏一个音符 */; t8 x0 g+ Q* G# T0 C( b* [4 l
void Sing_A_Note(int music,int mytime)+ d1 R1 o2 [; o: s* q
{9 h" B, N3 g4 w& I( K# q6 V" l
8 L8 T+ C* j' ]+ r2 R7 Q
int i;: c5 T5 E( Y+ R3 [0 E/ Z, |
Change_for_Note(music);. w6 ]4 E* {9 z
for(i=0;i
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
附件在哪里?
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
C调1= 440 Hz6 h' k: a0 g! X3 T( f6 u
然后按12平均率,算出每个音符的频率,
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART