#include "main.h"
#include "stm32f0xx.h"
int main(void)
{
uint16_t i=0;
//定义串口结构体
USART_InitTypeDef USART_InitStructure;
//定义IO口结构体
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//初始化系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
//使能端口时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//配置PA2,PA3的串口复用功能Alternate functions
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //端口复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽方式输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL; //悬空
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使能串口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//设置串口硬件参数
USART_DeInit(USART2);
USART_InitStructure.USART_BaudRate = 4800;
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;
USART_Init(USART2, &USART_InitStructure);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* 使能接收中断 */
/*
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
注意: 不要在此处打开发送中断
发送中断使能在SendUart()函数打开
*/
USART_Cmd(USART2, ENABLE); /* 使能串口 */
/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */
Delay_ms(10);
Usart_SendByte(USART2, 0x99);
while (1)
{
i=i+1;
Usart_SendByte(USART2, i);
Delay_ms(1000);
}
}
void USART2_IRQHandler(void)
{
/* 1个字节接收完毕的中断 */
if (USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)//RX
{
Usart_SendByte(USART2, 0x66);
}
/* 1个字节发送完毕的中断 */
if (USART_GetITStatus(USART2, USART_IT_TC) != RESET)//TX
{
}
}
void Usart_SendByte(USART_TypeDef* USARTx,uint16_t data)
{
USART_SendData(USARTx,data);Delay_ms(5);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);
}
void Delay_ms(uint16_t data)
{
uint16_t i;
for(i=0;i<data;i++)
{
Delay_us(100);
IWDG_ReloadCounter();
}
}
void Delay_us(uint16_t data)
{
uint16_t i,x;
for(i=0;i<data;i++)
{
for(x=0;x<3;x++)
{
;
}
}
}
stm32f030 usart2 发送不出去
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- xiongxiangsheng 2021-08-10 09:41关注
如果芯片为 STM32F030F4、K6、C6,则内部只有一个USART1。
即便其它芯片,使用 USART2 时需要将一下语句改为:
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_2);解决评论 打赏 举报无用 3
悬赏问题
- ¥15 有关wireshark抓包的问题
- ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
- ¥15 向数据表用newid方式插入GUID问题
- ¥15 multisim电路设计
- ¥20 用keil,写代码解决两个问题,用库函数
- ¥50 ID中开关量采样信号通道、以及程序流程的设计
- ¥15 U-Mamba/nnunetv2固定随机数种子
- ¥15 vba使用jmail发送邮件正文里面怎么加图片
- ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
- ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战