
$ w7 e1 F' i: i [& f 一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯7 Y$ m) X3 k: g/ P( [ 5 m! q, a( F2 m 本教程的主角是:串口 UART * O6 S% w' z: Q! b 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 - W5 S' ]* s' @) T% Q1 U6 ~ 主要特性: 3 G3 ^9 C! A8 E5 u2 F! ` b7 K 全双工的,异步通信 NR 标准格式 5 v7 Q9 u! h, Z8 ]: A 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) 7 L! L5 {0 @; y$ W 可配置的停止位 -支持1或2个停止位 6 l" c& ?( m7 M, e2 T LIN主发送同步断开符的能力以及LIN从检测断开符的能力 & Y+ ^5 g, m# g6 l6 u1 x8 P - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 发送方为同步传输提供时钟 IRDA SIR 编码器解码器 / Q# [# K5 T/ X: d: ? - 在正常模式下支持3/16位的持续时间 智能卡模拟功能 ! z$ f2 j7 P; W - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 ( h. h5 p3 i( J7 V9 h - 智能卡用到的0.5和1.5个停止位 6 f; i3 z& r, i; Y8 l( P) s- k X* i 单线半双工通信 3 F5 _& w/ U' ?0 A# b4 N' W+ Y5 n 使用DMA的可配置的多缓冲器通信 + b7 r) i- u, L' w3 D - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 单独的发送器和接收器使能位 检测标志 - 接收缓冲器满 5 `" q9 N# | ?+ H" N5 h9 ~ - 发送缓冲器空 - 传输结束标志 校验控制 - 发送校验位 0 f3 i# j" q& U3 a I - 对接收数据进行校验 . g' B H- ]- Y/ u- ` 四个错误检测标志 - 溢出错误 ; [& l% Z; ]- W2 L& X4 V9 ] - 噪音错误 - 帧错误 - 校验错误 5 P: P; L0 N. p( D, O! U8 U! {( @4 @. { 10个带标志的中断源 - CTS改变 # u& n$ `) C/ S' o+ ` - LIN断开符检测 - 发送数据寄存器 - 发送完成 - 接收数据寄存器 - 检测到总线为空, ~/ N0 ?9 W6 e+ _- { - 溢出错误 - 帧错误 - 噪音错误 - 校验错误 ' Z$ |) [% V6 o+ t 多处理器通信 - - 如果地址不匹配,则进入静默模式 9 Y# L' E d: ]) A) U 从静默模式中唤醒(通过空闲总线检测或地址标志检测) 两种唤醒接收器的方式 4 y' i2 K1 n% N' \7 |5 U - 地址位(MSB)4 X9 Y& i7 k3 p" H/ g - 空闲总线 + b; T1 T/ @4 m- g7 [& m7 } ; z$ L" X2 \4 a$ M) ?7 H ! m3 F, {$ _! {0 i! H ( C8 H8 F, ]# [3 A: H [/td] [/tr] [tr] [td] STM32的串口配置 也挺方便的 : |: j) w: n, V) h- K8 k$ z 首先是配置UART的GPIO口 /******************************************************************************* * Function Name : UART1_GPIO_Configuration * Description : Configures the uart1 GPIO ports.7 r: w0 @. `" b1 x6 l" S x! A' w * Input : None( ? U" r" b, k * Output : None * Return : None" x5 X% e, C4 g( @8 w! M9 f *******************************************************************************// L1 i% B/ m( [) S8 R" d void UART1_GPIO_Configuration(void)$ R' Q) r. L$ ]5 u {; f9 i; E& W3 F GPIO_InitTypeDef GPIO_InitStructure;/ e/ b6 C- d- e# j0 W6 i1 V // Configure USART1_Tx as alternate function push-pull * `4 B. R$ _4 E3 e% h GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# P0 G/ `# Z2 R# ]9 b* \ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);) W" V' [& Y5 z+ c/ i/ x$ D // Configure USART1_Rx as input floating GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;0 l# m8 Z \ {0 C GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;: a1 Q- C! w' Q6 i GPIO_Init(GPIOA, &GPIO_InitStructure); }5 L4 D% n/ H* |/ h9 `( T . @9 Z, i+ T8 S# i) r 然后是配置串口参数 4 H4 X3 ^( W- y$ { /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 如果需要使用中断的方式发送和接收数据 则需要使能串口中断 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) 2 Q5 b- n- o% q; p 功能描述 使能或者失能指定的 USART 中断 USART_IT 描述 USART_IT_PE 奇偶错误中断 ( H8 D: P! E4 d: m0 u% U$ K' ` USART_IT_TXE 发送中断 7 V9 P) g* e) \ USART_IT_TC 传输完成中断 0 F9 [- H7 X- ~ USART_IT_RXNE 接收中断 . a! Y- N6 K& V& z4 X USART_IT_IDLE 空闲总线中断 5 E) X2 w, X3 D; g8 r2 j USART_IT_LBD LIN中断检测中断 USART_IT_CTS CTS中断 % u o5 E: T* V! v USART_IT_ERR 错误中断 * R' H9 P. x, n */9 T+ P+ K, x. _3 f, } /*******************************************************************************9 b/ G$ f9 r* B6 |- J * Function Name : UART1_Configuration * Description : Configures the uart1 * Input : None * Output : None * Return : None *******************************************************************************/& U# j3 b7 O/ x+ Y6 N* X. W5 \' n void UART1_Configuration(void) { + W6 c) h0 ?# U& J0 P USART_InitTypeDef USART_InitStructure; /* USART1 configured as follow: - BaudRate = 9600 baud 1 b: e" l* j6 H _8 d M3 M - Word Length = 8 Bits - One Stop Bit) M; Y' Q" [7 p9 v& \0 N - No parity, ] P8 x$ A+ N9 ~! B' E: t - Hardware flow control disabled (RTS and CTS signals)5 B' L f+ y- i, p/ C - Receive and transmit enabled. e' C, b# u. `4 f4 b */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;5 g/ ^/ `5 ]/ u& O# N. N: f USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;7 Z7 N3 r& Q, t* u' u9 { USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;$ w. A3 V7 Q8 a" ^/ Y1 a5 L F& O4 X6 E; { $ b: k: \9 s! X2 }) Q5 Z) K /* Configure the USART1*/ 6 t2 r& j2 t; P6 ]. \5 J; l; y USART_Init(USART1, &USART_InitStructure);; G$ E5 ~# u) `9 a8 V8 w2 k 9 J) R9 ^5 m. _9 w# E /* Enable USART1 Receive and Transmit interrupts */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Enable the USART1 */) ] h2 F+ R4 U4 b. D9 m+ I, F USART_Cmd(USART1, ENABLE); ; E4 i! ^! i, n* D# M& h } [/td] [/tr] [tr] [td] 发送一个字符 /******************************************************************************* * Function Name : Uart1_PutChar4 B5 X" ?' t& [) A * Description : printf a char to the uart.- a: |/ p- ^: d( [+ B6 Q' q * Input : None * Output : None/ W0 p5 e) e. P4 n& s! \* l7 ? * Return : None *******************************************************************************/ u8 Uart1_PutChar(u8 ch) {8 Y' q. x, |, V* Y /* Write a character to the USART */ USART_SendData(USART1, (u8) ch);: a, g( [6 I2 D Z7 T' o P while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {4 K* `! f" q x; H8 { } return ch; \$ @9 F$ i. g/ L/ j- P+ D }9 ^2 n* P0 T# Q: z- G [/td] [/tr] [tr] [td]1 }( z) s* B; q' q ) q1 ?+ D5 J, }0 y$ G2 N <font size="3">发送一个字符串 /******************************************************************************* * Function Name : Uart1_PutString6 H/ L; b0 k, F( @ * Description : print a string to the uart1 * Input : buf为发送数据的地址 , len为发送字符的个数& f+ g0 x" b/ [0 m/ P * Output : None * Return : None *******************************************************************************/ void Uart1_PutString(u8* buf , u8 len)5 D8 [5 X3 D6 y% g2 s) e6 ~2 ]( C {( J' C" _2 H' J5 l 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频率加到蜂鸣器上能产生不一样的音符
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵
本教程的主角是:STM32 PWM 蜂鸣器
7 }# ]& a( V- r- J
/ E; E5 z# B3 g; y6 u/ W) W" z$ @
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵$ R2 @' b5 d# l$ u4 d
/*******************************************************************************) }* o. t* \) o w5 l
* Function Name : Change_for_Note) a3 S! h$ m" n$ G: t
* Description : 修改pwm频率& k0 _( s8 V- E1 S# k- a
* Input : u16类型的频率值/ p# X4 v5 J& u6 I
* Output : None
* Return : None2 m# f; q$ x5 ~* F' y7 \
*******************************************************************************/
void Change_for_Note(u16 NoteSet)5 X/ a' C! M0 v% z+ P U& I$ J9 W
{- Z2 p& u5 ^" D f1 r
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;& K! ?% E7 A0 Q/ u$ p0 o
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = NoteSet; 0 {# D$ u& w2 X- D: [ D! D7 R1 G* [
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;& |: X, [2 R, m# z1 p
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;. W, G# V6 ~, a J; z P
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;3 p& P* }* _4 h$ M4 i; C
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
} % k7 ]9 G% W, Q& U
7 f0 G4 ?" k5 l3 s
: {/ U3 X q6 D0 ?4 z
[/td] [/tr] [tr] [td]
1 q7 O$ z; L4 V) X
<font size="3">/* 取得音高和节拍 奏一个音符 */
void Sing_A_Note(int music,int mytime)
{
( k# o2 q$ {' k, _
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