|
一步一步的走 GPIO 按键 LED 定时器都说了 下面开始串口UART咯* e( @$ D1 J/ ^$ u, ]4 z 本教程的主角是:串口 UART # ^/ e5 x9 l, s: D) L 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 . y8 W! z; h) I, P/ x, [' G 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 + c% O/ V1 L! p( @1 ? / u7 B3 e% |0 V* G 主要特性: ' n; w0 s* Y! m0 y7 R" b 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 1 y* {6 e7 x! r' G+ p, k 可编程数据字长度(8位或9位) 可配置的停止位 -支持1或2个停止位 LIN主发送同步断开符的能力以及LIN从检测断开符的能力 - 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符 ! ]/ F* g# E4 r$ h. O0 Z 发送方为同步传输提供时钟 * p: _( C: _5 B, n! m, f IRDA SIR 编码器解码器 5 ~$ d! a3 u, t e - 在正常模式下支持3/16位的持续时间 智能卡模拟功能 - 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡 8 E+ V- L2 `8 {6 r: A0 M% a - 智能卡用到的0.5和1.5个停止位 ; i- q' I: {; X 单线半双工通信 使用DMA的可配置的多缓冲器通信 5 w0 [4 z# f- X3 L - 在保留的SRAM里利用集中式DMA缓冲接收/发送字节 单独的发送器和接收器使能位 4 G3 {. l0 E8 f, ]7 L 检测标志 - 接收缓冲器满 + K& n, O% x8 q% v+ z, A* q - 发送缓冲器空 & Y; ^8 x. R! k - 传输结束标志 $ v3 i( X8 @" ]# M1 n6 R 校验控制 - 发送校验位 6 k4 m) J1 X4 C, X2 n# ^; Z - 对接收数据进行校验 四个错误检测标志 # D/ |5 I5 [0 E/ u - 溢出错误 - 噪音错误 - 帧错误 " c* s$ ^; Q% Q) E0 ~& F* M! A - 校验错误 10个带标志的中断源 R; e) I: J# B9 h - CTS改变 - LIN断开符检测 , w9 s4 B( Y: `9 A* D( }0 K8 ? - 发送数据寄存器 C' v- @5 ~! p# Z' c - 发送完成 & d9 W* s" p) s7 A) S- k5 @9 Y; C - 接收数据寄存器* T( ]: P$ l+ u6 O z - 检测到总线为空/ V* `3 R# H) r# A - 溢出错误 5 h9 f% h' Z( o6 H/ p; S - 帧错误 - 噪音错误 - 校验错误 多处理器通信 - - 如果地址不匹配,则进入静默模式 从静默模式中唤醒(通过空闲总线检测或地址标志检测) 两种唤醒接收器的方式 - 地址位(MSB) - 空闲总线 {1 q9 i0 v" O$ x* ^- P- O$ E, t [/td] [/tr] [tr] [td] / a/ S+ r) z: Y5 C! Q1 X STM32的串口配置 也挺方便的 7 \, F9 L0 Z4 G4 B5 j) `) Q2 Y 首先是配置UART的GPIO口 ( e- L" B! |6 U% t3 S; D% i. k% X /******************************************************************************* * Function Name : UART1_GPIO_Configuration * Description : Configures the uart1 GPIO ports. * Input : None * Output : None * Return : None *******************************************************************************/ void UART1_GPIO_Configuration(void)2 B0 a. {3 b; n3 C. E2 b { GPIO_InitTypeDef GPIO_InitStructure;% d0 I( ]2 s ^' c // Configure USART1_Tx as alternate function push-pull : I! ^1 E* ?+ O5 L9 E. H1 {% }; C 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);3 E/ [ D( M9 Y+ |1 a // Configure USART1_Rx as input floating 9 ?9 T' Z1 }1 S; }) K# k1 x8 Y GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); }3 T9 d; t" F8 J7 c6 d- S0 Y' g 6 m9 q- K6 B7 M1 H+ V: O 然后是配置串口参数' }( P% A$ X( H0 m: M * b0 C E6 y2 ^) t. r7 M /* 如果使用查询的方式发送和接收数据 则不需要使用串口的中断 ) `( n2 a/ D+ V \6 S 如果需要使用中断的方式发送和接收数据 则需要使能串口中断 函数原形 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) 9 h: @) j8 F& D! S 功能描述 使能或者失能指定的 USART 中断 * Q/ d" c( _0 }0 y + T) I" z% @# B' r3 N2 Q% | USART_IT 描述2 N4 a4 z: p. Q) Q. P, S+ } USART_IT_PE 奇偶错误中断 USART_IT_TXE 发送中断 USART_IT_TC 传输完成中断 9 l2 {: u; i; s& c USART_IT_RXNE 接收中断 USART_IT_IDLE 空闲总线中断 USART_IT_LBD LIN中断检测中断 % X; f! B! G" z% F0 @% K; i6 ] USART_IT_CTS CTS中断 * L2 s, k5 w8 L3 _% m' | M USART_IT_ERR 错误中断 5 H/ t- @, G. G S. Q * i; u: Z# w# e+ \ */ * d6 ~/ }0 ^" u8 ]' f /*******************************************************************************2 P( `# e! d+ F/ I * Function Name : UART1_Configuration0 t# x$ N6 L4 u) b3 V% k * Description : Configures the uart1 $ M$ Q7 ?8 |3 r * Input : None * Output : None * Return : None* g; g- E" ~7 S$ Y6 j *******************************************************************************/" Y( @1 v* x E& y+ x- E1 x void UART1_Configuration(void)8 | f5 e+ c$ i% X% J8 i+ c; Q { USART_InitTypeDef USART_InitStructure; /* USART1 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit8 ]+ e% T" m+ M" j+ h - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled0 }$ S9 C4 n* |+ x */; R& \6 k( w( E4 m USART_InitStructure.USART_BaudRate = 9600;( I: n ?! K$ o3 M% D' ` USART_InitStructure.USART_WordLength = USART_WordLength_8b;9 n8 a3 q% |/ B" F; }" t% a1 e USART_InitStructure.USART_StopBits = USART_StopBits_1;6 M) U! B4 ^' [$ ~- E* l' y USART_InitStructure.USART_Parity = USART_Parity_No ;: c' {! K3 o; h# B8 k USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/ u) [. T6 ~. s9 S: V USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; # N& v- \/ R( a /* Configure the USART1*/ 4 _8 Q. j8 T2 P4 n( W6 i) S USART_Init(USART1, &USART_InitStructure);/ Y4 s6 k3 ?& S' b% Z. _ 5 i6 n; p- ?+ f1 `+ o" n /* Enable USART1 Receive and Transmit interrupts */! H: k0 R* l9 f+ a& Q6 A. N$ }5 k# L USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Enable the USART1 */ USART_Cmd(USART1, ENABLE); ) j1 \) I+ K* Z/ ?+ T5 E: P9 b }$ g: w4 F7 ~+ P+ R5 o. ?% u! G* Q2 q) n. [ 8 g0 e0 c; X; W' o3 Z [/td] [/tr] [tr] [td] 发送一个字符 /*******************************************************************************/ i* T/ E5 J) }; U" f4 @4 n/ y9 u * Function Name : Uart1_PutChar+ I4 v: Y, O8 c! n * Description : printf a char to the uart. * Input : None * Output : None * Return : None *******************************************************************************/0 P6 Y, V6 H( t) ]/ p: F# X u8 Uart1_PutChar(u8 ch): J6 Q l' j2 y1 I' r {, L0 o- \8 Z* Q9 H /* Write a character to the USART */ USART_SendData(USART1, (u8) ch);- Z/ c5 @' J# n" O5 L0 N while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)6 \' c7 ^- x4 [7 G { } return ch; } [/td] [/tr] [tr] [td]0 ]' q4 p/ T2 u/ x9 I, l- t$ J <font size="3">发送一个字符串$ N( X$ g0 _. b: M6 j6 H/ e$ o( ] /*******************************************************************************0 U3 y) S% g" U8 a * Function Name : Uart1_PutString * Description : print a string to the uart1) P7 O" V: h9 F4 Y * Input : buf为发送数据的地址 , len为发送字符的个数 * Output : None * Return : None6 c% o0 u5 F4 X4 j+ | *******************************************************************************/1 c: j- n; a" Z1 i* f void Uart1_PutString(u8* buf , u8 len)7 W9 {- {- [' b {/ A7 f9 z) Q0 l# ` 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已经做出来了哦 呵呵 )
是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符
呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了+ Z, e) K( h& P( a% O
还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵 : O. p+ M5 N( ]. p( ]
本教程的主角是:STM32 PWM 蜂鸣器 7 Q, c% v3 a$ r7 l5 }4 Z
$ _$ A: \9 K! Q8 Q. U" \" x* u
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵
/*******************************************************************************
* Function Name : Change_for_Note0 y8 ^( q3 a& h
* Description : 修改pwm频率& U( S! C" U9 ^1 t
* Input : u16类型的频率值- o' K" n' ]* `3 ~$ X/ I$ @/ S$ r5 R
* Output : None
* Return : None
*******************************************************************************/ a+ z6 w2 q+ Q
void Change_for_Note(u16 NoteSet)4 D+ g) k% s, R4 }3 v0 O% e. D
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
' ?9 w5 L/ l9 e9 p
/* Time base configuration */8 U4 Y' @; Y8 \5 a7 g# O
TIM_TimeBaseStructure.TIM_Period = NoteSet;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;6 R: d6 W4 ~* L# v
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
! I. n$ `# N& b2 x# x
/* PWM1 Mode configuration: Channel4 */" x: c5 P% t+ G6 l2 _
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;- U8 I; w& W% b; `0 F2 I
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);
} / i. R \- b% X2 ^
3 j; W4 x/ r0 ^, k# t
[/td] [/tr] [tr] [td]/ G. m. ~" ?- @( M' L6 e
<font size="3">/* 取得音高和节拍 奏一个音符 */
void Sing_A_Note(int music,int mytime)
{" d# T- i4 L& H4 _
2 F7 ]& P, J/ ^/ F# v
int i;2 x3 B% c- m. W2 w: K
Change_for_Note(music);/ a; o/ s1 ~& B" s3 U/ T, y6 B
for(i=0;i
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
附件在哪里?
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
C调1= 440 Hz6 F2 m6 b; I. J# i. P; `
然后按12平均率,算出每个音符的频率,
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART
RE:豆皮 - STM32开发板入门教程(四) - 串口通讯 UART