
一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯- j% Y: Y8 I. e- V, D# J 本教程的主角是:串口 UART ' ~ y V1 y3 J" ~5 S+ n 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 , I: V K" j1 x% }6 h" R: |, m 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 主要特性: : C- z( @8 U q. }, \ J 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) , H7 u. V& s. u% J 可配置的停止位 -支持1或2个停止位 LIN主发送同步断开符的能力以及LIN从检测断开符的能力 - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 ; J1 J. x* \- o- }$ h, g' B& a( p 发送方为同步传输提供时钟 # [' J, X$ v0 E IRDA SIR 编码器解码器 - 在正常模式下支持3/16位的持续时间 智能卡模拟功能 ' Q7 G; |! G5 V/ b L5 l _/ b' F - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 ( \( i8 B& u8 F3 p: D% L - 智能卡用到的0.5和1.5个停止位 单线半双工通信 使用DMA的可配置的多缓冲器通信 - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 单独的发送器和接收器使能位 检测标志 " Z0 P" O' W8 X! s3 x - 接收缓冲器满 - 发送缓冲器空 # W$ w1 ]4 K- [( x7 N& w - 传输结束标志 7 B' d8 r+ i X' x8 | 校验控制 - 发送校验位 - 对接收数据进行校验 四个错误检测标志 - 溢出错误 4 d, {' t, }" q6 H - 噪音错误 - 帧错误 - 校验错误 ! z% Y9 O( U, p( T: F$ |( h+ } 10个带标志的中断源 7 C, t2 G% Z1 G/ k0 v" v, l - CTS改变 - LIN断开符检测 ( `; t% C p0 k - 发送数据寄存器0 Q9 v' I1 {6 u2 Q. y$ F3 C: ?9 g - 发送完成 7 f, m( C+ J1 h; O( { - 接收数据寄存器 - 检测到总线为空 - 溢出错误 1 h* a' B, U0 m% S# x! S - 帧错误 , n4 }8 { M/ j: n E* K - 噪音错误 # B3 D2 k F1 @: S0 m - 校验错误 多处理器通信 - - 如果地址不匹配,则进入静默模式 从静默模式中唤醒(通过空闲总线检测或地址标志检测) & w/ U+ V! s# _( A/ H 两种唤醒接收器的方式 - 地址位(MSB)5 g' |* W) [; J* g0 D; s- t - 空闲总线 [/td] [/tr] [tr] [td]2 H- ?2 V) u( z- X5 j3 @2 h3 | STM32的串口配置 也挺方便的 $ C1 c, I4 r+ d! H# Y/ A4 w, F 首先是配置UART的GPIO口 /*******************************************************************************0 l6 {: r: y3 m. w: q/ B; u/ Z * Function Name : UART1_GPIO_Configuration * Description : Configures the uart1 GPIO ports.6 g0 H$ \1 F: b8 K- v3 _" T$ d * Input : None * Output : None+ w+ E9 F7 D( T$ q * Return : None* U* I1 `0 i: z *******************************************************************************/ void UART1_GPIO_Configuration(void) {& V" P9 Z1 I1 G* h2 m* b7 p GPIO_InitTypeDef GPIO_InitStructure; // 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;4 d, r; F+ P' z8 o3 z GPIO_Init(GPIOA, &GPIO_InitStructure); 9 |6 R& C: M& R4 P3 G! }. U // Configure USART1_Rx as input floating GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;+ Z2 }: ?7 O# v8 ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;, C, F- G$ v# A* o- A- p GPIO_Init(GPIOA, &GPIO_InitStructure); } , r3 t# E& t2 } 然后是配置串口参数# L2 ]2 Q0 w8 p& \4 }; p K0 z: `- | /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 如果需要使用中断的方式发送和接收数据 则需要使能串口中断 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) * O% ~! N* F" V- o$ | 功能描述 使能或者失能指定的 USART 中断 , Q, y, }4 O- _* e7 P , `6 r Z. d8 N" l4 S& \ USART_IT 描述- E* N! N8 Y4 I' X7 s! N USART_IT_PE 奇偶错误中断 USART_IT_TXE 发送中断 USART_IT_TC 传输完成中断 USART_IT_RXNE 接收中断 * z% T8 [6 K2 v- m. ` USART_IT_IDLE 空闲总线中断 9 v" P) U: W. W+ P9 F* Y+ ~ USART_IT_LBD LIN中断检测中断 USART_IT_CTS CTS中断 USART_IT_ERR 错误中断 3 T5 i/ W, [/ P3 e- P/ i */& f4 T! w, }# ]9 z 4 [+ q; ]0 Q! }1 T /*******************************************************************************" l/ ?7 z% N( t$ [ * Function Name : UART1_Configuration- M& ]& S6 Y9 M/ n- B' u * Description : Configures the uart1 * Input : None) s5 M' s$ e6 h3 G, T7 p * Output : None * Return : None *******************************************************************************/$ x: p8 }- t) M" {* [5 p void UART1_Configuration(void)- L6 b" N6 k( }8 K$ w9 m) x { USART_InitTypeDef USART_InitStructure;. N$ n& m4 F* V& ~6 Y, [+ X /* USART1 configured as follow:; i3 G1 a# ^. t- Y( D5 A# y - BaudRate = 9600 baud - Word Length = 8 Bits3 E2 I9 a2 \0 Q6 p1 B - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals)1 s. n2 q) L5 P - Receive and transmit enabled; e- Q4 M7 X3 M */6 ^& e3 a# }6 X0 S7 Q) }, N& A USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 |3 K( q5 ?4 ~1 j USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ;4 B! I% k8 w% a+ ?7 P" s. P USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;1 \- w$ I c% P! o USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 9 q, u6 A1 Y, Z. c /* Configure the USART1*/ 5 N9 Z( d6 k t" ~+ w2 q! U# R USART_Init(USART1, &USART_InitStructure);. M/ X; Y- D' P6 ?4 d. ~ /* Enable USART1 Receive and Transmit interrupts */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);. Y2 w" A7 T. ^1 A! [% k4 m. i , G; L# R1 \$ d" }# O4 K; \ /* Enable the USART1 */% A/ R% o+ i4 s+ _3 [; N USART_Cmd(USART1, ENABLE); }0 i4 ~+ X/ y* X/ J% X 3 @4 E$ h$ b- ]9 F0 g [/td] [/tr] [tr] [td]( z2 u0 Z5 k( w; A% b 发送一个字符- W- F* F: p) [, s( z /******************************************************************************* * Function Name : Uart1_PutChar * Description : printf a char to the uart. * Input : None( a# c" v2 q. B: ] * Output : None * Return : None+ ^7 G& C$ q) v5 K, X *******************************************************************************/: F) F7 x, Y+ N* U+ t0 _ u8 Uart1_PutChar(u8 ch)+ k1 o& w9 d R4 b$ A9 u { /* Write a character to the USART */ USART_SendData(USART1, (u8) ch);; l7 X# i) D. u& s while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {$ A6 `8 r4 M' o; i: ` } return ch;* W5 t! K6 y; h- D+ M5 D } [/td] [/tr] [tr] [td]# F6 G4 L# [/ X9 y& n <font size="3">发送一个字符串7 t b! s% O9 O# U /*******************************************************************************4 G/ N9 B! c) S2 M4 q: G' K * Function Name : Uart1_PutString& s) i! f7 T0 U6 v4 E' L* D0 I2 \5 \! F * Description : print a string to the uart1# s& U( N- M1 s9 F0 w# E( ] * Input : buf为发送数据的地址 , len为发送字符的个数 * Output : None * Return : None, V* X8 g5 l& V8 a" |) X+ a *******************************************************************************/ void Uart1_PutString(u8* buf , u8 len) {1 E& Z: }$ h- `9 C8 i for(u8 i=0;i |
NUCLEO-H723ZG开发板试用 ——串口点灯测试
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
S2LP 的 sniff 模式如何同时满足通讯和低功耗要求
双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证
意法半导体 STHV200超声波 IC单片简化设计
了解NFC技术优势与应用场景
基于STM32软件实现底层函数经验分享—IIC通信
豆皮 - STM32开发板入门教程(五) - 我的豆皮会唱歌 (原...
呵呵 不是播放MP3啦(顺便说一下 豆皮播放MP3 bozai已经做出来了哦 呵呵 )
是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符5 Y& E- I! A' T# |( d% N# j5 D# A
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了# Z# _9 K- K0 Y$ r! E
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵 / z9 t. ^1 J7 _6 J" X q y
本教程的主角是:STM32 PWM 蜂鸣器
1 N* |' f0 R2 u; ~) U1 g9 z9 X G
/ ^0 \9 ~6 D2 |# e3 j( |7 y. _
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵
/*******************************************************************************- |* I: n$ [) C- o
* Function Name : Change_for_Note
* Description : 修改pwm频率# u k! W: e% q/ I# r$ n# v
* Input : u16类型的频率值
* Output : None# Q& S0 i- m8 ~( d& J
* Return : None
*******************************************************************************/
void Change_for_Note(u16 NoteSet)
{. W$ q7 M9 v5 ?5 I# D& a! C
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;7 ~7 N. F% Z/ ^8 N$ Q& Z$ f
2 u" Z; U, F$ x, l; f8 o
/* Time base configuration */6 N; ?: V4 h O7 S; a
TIM_TimeBaseStructure.TIM_Period = NoteSet;
TIM_TimeBaseStructure.TIM_Prescaler = 0;/ O/ s4 H! g( V4 ^7 c6 T
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;- g) ?, R% W5 D/ U5 u/ Y7 O
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;, t+ V! T8 k# X
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);: k' q' i+ R2 m: y
8 a3 ^: X3 {& \" O) R: T5 Q6 b
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/ w. r$ c6 k$ v* w( y2 d
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
}
" w! ^- \+ l( A2 V- C9 x" `2 \+ Q" ?
[/td] [/tr] [tr] [td]
<font size="3">/* 取得音高和节拍 奏一个音符 */6 ?5 _& u8 J. c# [. V% U# A8 ?; ?* X
void Sing_A_Note(int music,int mytime)! ~+ m. a, {0 _& D
{: Z8 r2 ~+ ~ ?5 F
int i;
Change_for_Note(music);& L/ k4 W9 P4 e- v# c' j0 _
for(i=0;i
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
附件在哪里?
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
C调1= 440 Hz
然后按12平均率,算出每个音符的频率,
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART