
一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯5 ~) m$ }: ^3 }: @5 \* A 本教程的主角是:串口 UART 4 y; \5 e- {: r. [9 x ) t# [9 g; r$ ` F 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 + F. w9 C8 R$ W 主要特性: 全双工的,异步通信 NR 标准格式 2 Y8 G9 m% d: H, K8 e/ I! F) d 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) 5 _; F# f- Q1 M. k8 t! J 可配置的停止位 -支持1或2个停止位 6 a, h5 s3 Z3 R5 N LIN主发送同步断开符的能力以及LIN从检测断开符的能力 - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 发送方为同步传输提供时钟 8 X% E/ a2 d- a# e- ~ IRDA SIR 编码器解码器 - 在正常模式下支持3/16位的持续时间 $ g0 t& P; C# O: v 智能卡模拟功能 & Q3 ?! R4 m% j: y# F: Q - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 ' X. K8 G+ I' I3 ]- G2 Z5 F) d - 智能卡用到的0.5和1.5个停止位 单线半双工通信 - i3 j5 k; {, U0 z1 B 使用DMA的可配置的多缓冲器通信 - t1 ]" K9 X5 ?2 q - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 单独的发送器和接收器使能位 检测标志 + I$ {+ ]: u/ y2 c7 ?6 c' ^; v0 S - 接收缓冲器满 4 F0 r) m- C6 J' H, u+ H - 发送缓冲器空 " I/ w) k( K7 O2 o" y1 } - 传输结束标志 校验控制 # E0 p% G# y) ?4 U; [7 X/ p - 发送校验位 0 {. Y. t e ^- g) t# u( D - 对接收数据进行校验 四个错误检测标志 - m$ I P" K/ g6 g; g& e' G9 h - 溢出错误 5 o+ g8 e8 f- f9 I! k8 X# g - 噪音错误 - 帧错误 - 校验错误 7 F* }4 d: e& W7 W 10个带标志的中断源 ! @* @6 V! G- t* d - CTS改变 . X* s$ B b# Z, D - LIN断开符检测 + H+ t* O0 ~1 B$ ^; X- `2 b - 发送数据寄存器 - 发送完成 + B4 _$ ^7 e( ?% }1 ~) h9 W% w - 接收数据寄存器 - 检测到总线为空- N! E( x3 h$ R5 e. T& x - 溢出错误 , ~7 l) h5 _. E) ~- h8 F - 帧错误 % [) k; X( @$ j - 噪音错误 - 校验错误 多处理器通信 - - 如果地址不匹配,则进入静默模式 8 d: N% P, u$ ~ 从静默模式中唤醒(通过空闲总线检测或地址标志检测) " k+ x& j T |5 x& m6 O: W+ F 两种唤醒接收器的方式 9 J2 [# K" _. M0 q |; Y - 地址位(MSB)" d! l7 x3 V1 M2 C+ K+ M - 空闲总线 + H2 J+ Z# T% _7 |2 d$ l/ \0 @ 2 ~3 n$ ]7 W9 s' v [/td] [/tr] [tr] [td] + Y& P$ I7 E6 {0 S) W7 S, {7 `6 N* P STM32的串口配置 也挺方便的 8 m5 k. F& @& \8 m6 Y- m 首先是配置UART的GPIO口 0 R7 J7 j( Y/ S; c s /*******************************************************************************2 _& W2 b F* _! p) a% P5 `' e2 J * Function Name : UART1_GPIO_Configuration# c$ |% ~5 f9 ^/ k8 Y * Description : Configures the uart1 GPIO ports.! o% f' d. r b8 _8 S2 M$ [7 B5 G1 u * Input : None9 Y; S: n+ L* l, v * Output : None * Return : None *******************************************************************************/ void UART1_GPIO_Configuration(void)- i5 F7 p. F) J {; {5 K z6 R* M8 h- V2 a! Y4 T GPIO_InitTypeDef GPIO_InitStructure;* Y- M: r+ D8 q+ l // Configure USART1_Tx as alternate function push-pull ( i5 E* O' Z) s4 D2 S0 H GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); - R5 L- a o# f" q // Configure USART1_Rx as input floating GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;3 @# \' l( K# v4 q GPIO_Init(GPIOA, &GPIO_InitStructure); }3 h1 V, ?; u+ F M5 Z: v 然后是配置串口参数) H; w! _. l, a 4 N/ ~* h& I) b6 X) i ! { y4 c! _ \: L$ V9 _ /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 如果需要使用中断的方式发送和接收数据 则需要使能串口中断 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) . _( `& A6 a2 P$ y 功能描述 使能或者失能指定的 USART 中断 7 A$ M) Q4 u( g' Q USART_IT 描述 USART_IT_PE 奇偶错误中断 USART_IT_TXE 发送中断 USART_IT_TC 传输完成中断 / q* W' m3 [8 R7 _: ? USART_IT_RXNE 接收中断 7 l' a0 d( y$ ]/ K USART_IT_IDLE 空闲总线中断 1 {5 c8 }% ?4 t% @6 n& W: g+ g USART_IT_LBD LIN中断检测中断 4 i$ g& B Y3 v# g# [* G USART_IT_CTS CTS中断 USART_IT_ERR 错误中断 7 c) Q7 a* Q4 z( K2 {8 G0 s: k */ /*******************************************************************************9 w) G1 M" A% J- c% E+ l * Function Name : UART1_Configuration- j1 k. H& U) H: W1 t( V' n6 ^ * Description : Configures the uart1 * Input : None * Output : None * Return : None2 h' n# N7 k5 F" f0 W *******************************************************************************/0 L/ h- A) ?! s6 p* y3 f void UART1_Configuration(void)8 A+ J$ }5 L Z, E {' ~- E& R+ ], Z) b# A . n; Y9 [ s$ n8 Y" v7 u3 Z USART_InitTypeDef USART_InitStructure; /* USART1 configured as follow: - BaudRate = 9600 baud 8 h5 G$ {: u* Q; t - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals)5 Z4 B3 o$ t2 `, i# M+ h - Receive and transmit enabled( g5 c9 r9 b" s */ USART_InitStructure.USART_BaudRate = 9600; 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_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;3 i% R( v1 n$ Z " c: i1 N0 `( W4 B' S /* Configure the USART1*/ USART_Init(USART1, &USART_InitStructure); /* Enable USART1 Receive and Transmit interrupts */6 G& r# w. d" w6 o2 u! ^7 \ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); " }8 Y3 J% [6 k. F# s /* Enable the USART1 */. ?" o* l( F2 A USART_Cmd(USART1, ENABLE); 7 m: l3 K4 a B$ t0 } }) r2 K4 T1 O( g / @ R8 ?8 `; I [/td] [/tr] [tr] [td] 发送一个字符 /******************************************************************************* * Function Name : Uart1_PutChar2 j; N" ~$ I c3 ?# _" A. H# T * Description : printf a char to the uart. * Input : None * Output : None7 M; m5 e& W% F1 e, ^' A: _7 C * Return : None *******************************************************************************/ u8 Uart1_PutChar(u8 ch) {' p; r- W2 q- |2 ^4 _: T+ P) \ /* Write a character to the USART */ USART_SendData(USART1, (u8) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)1 z% d: c4 b2 i {4 a; h% w9 E4 T& w+ a2 c } return ch; } [/td] [/tr] [tr] [td] % b1 q H8 w% E6 U9 a7 Q1 Z <font size="3">发送一个字符串2 H! P6 p* y5 r" N8 D" N /*******************************************************************************2 L3 m6 r5 P- X" Z: m2 \7 H * Function Name : Uart1_PutString * Description : print a string to the uart1: _1 c! K6 h B$ a) R8 W* d * Input : buf为发送数据的地址 , len为发送字符的个数 * Output : None * Return : None *******************************************************************************/ void Uart1_PutString(u8* buf , u8 len)7 i$ B {5 v: A1 M, X {4 }6 C- x4 w: w/ o 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已经做出来了哦 呵呵 )/ c9 c+ C& ?: v
是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符& R; Z6 S, i5 R& c
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了! D7 J# O0 V) H1 y0 e6 i# t5 u$ i
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵
$ n4 j, s$ [: ~3 P! N
本教程的主角是:STM32 PWM 蜂鸣器 ( L( i8 O; Z, C$ i- x% a
$ D6 p: |) \" D( I$ \
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵, F* }6 _ H! e% Z& q% [; a
/*******************************************************************************, M: Q" i' i/ R! N0 m- M
* Function Name : Change_for_Note
* Description : 修改pwm频率9 n5 |0 [8 g) M0 \* {
* Input : u16类型的频率值4 ?9 K N" {( L L! a
* Output : None, i6 S' I+ u# u* [9 P
* Return : None7 e; q6 N, Z8 W4 \; |1 _
*******************************************************************************/
void Change_for_Note(u16 NoteSet)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
" d2 v3 o$ F# `# c! }
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = NoteSet; / s* j2 p8 k, h$ Z
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;& d' b7 I" a; ?: Z& b# G
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;0 n3 J2 z$ e* k* s' h; Z0 w5 V
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
} 6 f4 P$ {: a# I
& D0 k: M3 \- L1 [( b
/ Y" z2 F7 N/ m; Y
[/td] [/tr] [tr] [td]
<font size="3">/* 取得音高和节拍 奏一个音符 */
void Sing_A_Note(int music,int mytime)
{( N4 t1 g4 |( ?# t1 c4 [
int i;
Change_for_Note(music);
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