关于一次函数的应用题STM32的USART_SendData()函数参数的问题

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
STM32串口收发的总结
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口stm32应用-简单的串口接收与发送程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
stm32应用-简单的串口接收与发送程序
与上位机的串口通信是一个很常用的程序。碧海蓝天在刚刚接触stm32芯片时写的第一个简单程序就是串口通信,现在把程序代码甩出来与大家分享。完整的程序哦~一般人我不告诉他
&库版本& :ST3.0.0
文件:mian.c
//功能:串口初始化、打开定时器中断,然后一直接收数据状态就好了。发送在中断中实现
#include "stm32f10x.h"
#include "usart.h"
u8 USART_rx_
int main(void)
&&RCC_Configuration();&&&&&
//系统时钟配置
&&GPIO_Configuration();&&&&&
//端口初始化
&&NVIC_Configuration();&&&&&
//中断源配置
&&USART_Configuration();&
&&&//串口1初始化
&&Time_Init();&&&&&&&&&&&
//定时器初始化
&&#ifdef DEBUG
&&&&&&debug();
&&TIM_Cmd(TIM3,ENABLE);&
&& while(1)
文件:usart.c
#include "stm32f10x.h"
#include "stdio.h"
#include "usart.h"
&&unsigned char auchCRCHi [256]
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
&&0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};
&&unsigned char auchCRCLo [256]
&&0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,
&&0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,
&&0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,
&&0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,
&&0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
&&0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,
&&0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,
&&0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,
&&0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,
&&0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
&&0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,
&&0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,
&&0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,
&&0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,
&&0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
&&0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
unsigned short CRC16(unsigned char* puchMsg, unsigned short
usDataLen)
&&unsigned char uchCRCHi = 0xFF
&&unsigned char uchCRCLo = 0xFF
&&unsigned char uI
&&while (usDataLen--)
&&&&uIndex
= uchCRCHi^*puchMsg++;
&&&&uchCRCHi
= uchCRCLo^auchCRCHi[uIndex];
&&&&uchCRCLo
= auchCRCLo[uIndex];
&&return (uchCRCHi && 8 |
uchCRCLo) ;
void RCC_Configuration(void)
& ErrorStatus
HSEStartUpS&&
&&&//枚举变量,定义高速时钟的启动状态
RCC_DeInit();&&&&&&&&&&&&&&&&&&
//RCC系统重置,用于Debug目的
RCC_HSEConfig(RCC_HSE_ON);&&&&&&&&&&&&&&&&
//使能高速时钟源HSE&&
& HSEStartUpStatus =
RCC_WaitForHSEStartUp();&&&
//等待HSE稳定
& if(HSEStartUpStatus == SUCCESS)
FLASH_SetLatency(FLASH_Latency_2);&&&&&
&FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);&&&&&
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);&&&&&&&&
///PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08){}
& RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1
|RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB ,
& RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,
//------------------------------------------------------------------
//函数名:void GPIO_Configuration()
//输入参数:null
//返回参数:null
//说明:GPIO初始化函数
//------------------------------------------------------------------
void GPIO_Configuration(void)
& GPIO_InitTypeDef
GPIO_InitS&&&&&//GPIO初始化结构体声明
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_9;&&&&&&&&&
//USART1 TX
& GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;&&&
//复用推挽输出
& GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;&&
& GPIO_Init(GPIOA,
&GPIO_InitStructure);&&&&&
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_10;&&&&&&&&&
//USART1 RX
& GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;&&
//复用浮空输入
& GPIO_Init(GPIOA,
&GPIO_InitStructure);&&&&&&&&&&
&GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6;&
&GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_Out_PP;&&
&GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
&GPIO_Init(GPIOB, &GPIO_InitStructure);
//------------------------------------------------------------------
//函数名:void NVIC_Configuration()
//输入参数:null
//返回参数:null
//说明:NVIC初始化函数
//------------------------------------------------------------------
void NVIC_Configuration(void)
{&&&&&&&&&&&&&&
& NVIC_InitTypeDef
NVIC_InitS&&&&&&
//NVIC初始化结构体声明
VECT_TAB_RAM&&&&&&&
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
//如果程序在RAM中调试那么定义中断向量表在RAM中否则在Flash中
NVIC_SetVectorTable(NVIC_VectTab_FLASH,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
& NVIC_InitStructure.NVIC_IRQChannel =
USART1_IRQn;&&&&&&&
&//设置串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =
0;&&&&&&&&
//抢占优先级 0
& NVIC_InitStructure.NVIC_IRQChannelSubPriority =
0;&&&&//子优先级为0
& NVIC_InitStructure.NVIC_IRQChannelCmd =
ENABLE;&&&&&//使能
& NVIC_Init(&NVIC_InitStructure);
& NVIC_InitStructure.NVIC_IRQChannel =
TIM3_IRQn;
//设置定时器3全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =
//抢占优先级 1
& NVIC_InitStructure.NVIC_IRQChannelSubPriority =
//子优先级为0
& NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& NVIC_Init(&NVIC_InitStructure);
//------------------------------------------------------------------
//函数名:void USART_Configuration()
//输入参数:null
//返回参数:null
//说明:串口初始化函数
//------------------------------------------------------------------
void USART_Configuration(void){
& USART_InitTypeDef
USART_InitS&&&&&&&&&&&&&&&&&&
//串口初始化结构体声明
& USART_ClockInitTypeDef
USART_ClockInitS
& USART_InitStructure.USART_BaudRate =
115200;&&&&&&//设置波特率为115200bps
& USART_InitStructure.USART_WordLength =
USART_WordLength_8b;&&//数据位8位
& USART_InitStructure.USART_StopBits =
USART_StopBits_1;&&&//停止位1位
& USART_InitStructure.USART_Parity =
USART_Parity_No;&&&&//无校验位
& USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_N&&
//无硬件流控
& USART_InitStructure.USART_Mode = USART_Mode_Rx |
USART_Mode_Tx;&&&&&//接受和发送模式都打开
USART_ClockInitStruct.USART_Clock=USART_Clock_D&&&&&
//串口时钟禁止
USART_ClockInitStruct.USART_CPOL=USART_CPOL_L&&&&&&&
//数据低电平有效
USART_ClockInitStruct.USART_CPHA=USART_CPHA_2E&&&&//配置CPHA使数据在第2个边沿的时候被捕获
USART_ClockInitStruct.USART_LastBit=USART_LastBit_D&&//
禁用最后一位,使对应的时钟脉冲不会再输出到SCLK引脚
& USART_ClockInit(USART1,
&USART_ClockInitStruct);
&&&&&//配置USART与时钟相关的设置
& USART_Init(USART1,
&USART_InitStructure);&&&&&&&//配置串口参数函数
& USART_ITConfig(USART1, USART_IT_RXNE,
ENABLE);&&&&&&
//使能接收中断
//USART_ITConfig(USART1, USART_IT_TXE,
ENABLE);&&&&//使能发送缓冲空中断
//USART_ITConfig(USART1, USART_IT_TC,
ENABLE);&&&&//使能发送完成中断
USART_ClearFlag(USART1,USART_FLAG_TC);&&&&&&&&
//清除发送完成标志位
& USART_Cmd(USART1,
ENABLE);&&&&&&&&&//使能串口1
//------------------------------------------------------------------
//函数名:void Time_Init()
//输入参数:null
//返回参数:null
//说明:定时器初始化函数
//------------------------------------------------------------------
void Time_Init(void)
& TIM_TimeBaseInitTypeDef
TIM_TimeBaseS
TIM_DeInit(TIM3);&&&&&&&&&&&&//复位TIM3定时器
& TIM_TimeBaseStructure.TIM_Period
=7999;&&&&&&&&
&//设置自动重装载寄存器锁存值,1ms溢出&&&&&&
& TIM_TimeBaseStructure.TIM_Prescaler =
8;&&&&&&//9分频&
& TIM_TimeBaseStructure.TIM_ClockDivision =
0x0;&&&&&&
//时钟分频因子
& TIM_TimeBaseStructure.TIM_CounterMode =
TIM_CounterMode_Up;&//计数器向上计数模式
&&&&&&&&&&&&
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);&&&&//写TIM3各寄存器参数
& TIM_ClearFlag(TIM3,TIM_FLAG_Update);
& TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
文件:usart.h
#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"
void RCC_Configuration(void);&&
//声明RCC初始化函数
void GPIO_Configuration(void);&&
//声明GPIO初始化函数
void NVIC_Configuration(void);&&
//声明NVIC初始化函数
void USART_Configuration(void);&&
//声明串口初始化函数
Time_Init(void);&&&&
//声明定时器初始化函数
unsigned short CRC16(unsigned char* puchMsg, unsigned short
usDataLen);
文件:stm32f103x_it.c
//需要设置串口接收中断和定时器3中断,中断时间为1ms
//------------------------------------------------------------------
//函数名:void USART1_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:串口接收中断服务
//------------------------------------------------------------------
void USART1_IRQHandler(void)
&&if(USART_GetITStatus(USART1,
USART_IT_RXNE) !=
RESET)&&&&&&&&&
//判断读寄存器是否非空
&&&GPIO_SetBits(GPIOB,GPIO_Pin_6);
&&&&rx_data[RbufCounter++]=USART_ReceiveData(USART1);&
& //接收字节到接收缓冲区
&&&&if(USART_Rsv_Status==0)
&&&&&&if(RbufCounter&1)
&&&&&&&&if(rx_data[0]==0xA5&&rx_data[1]==0x5A)&&&
//当接收到的数据帧头两个字节同时为0xA5和0x5A时
&&&&&&&&&&USART_Rsv_Status=1;
&&&&&&&&&&USART_SendData(USART1,
rx_data[0]);
&&&&&&&&else
&&&&&&&&&&rx_data[0]=rx_data[1];
&&&&&&&&&&RbufCounter=1;
&&&&&&USART_1ms_Cnt=0;
&&&&}&&&&&&&&&&&&
&&}&&&&&&&&&
//------------------------------------------------------------------
//函数名:void TIM2_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:定时器2中断服务
//------------------------------------------------------------------
void TIM2_IRQHandler(void)
//------------------------------------------------------------------
//函数名:void TIM3_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:定时器3中断服务
//------------------------------------------------------------------
void TIM3_IRQHandler(void)
&&if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)&&&&&&&
//判断是否为定时器3溢出中断
&&&&GPIO_SetBits(GPIOB,GPIO_Pin_6);
&&&&TIM_ClearITPendingBit(TIM3,
TIM_IT_Update);&&//清中断标记
&&&&if(USART_Rsv_Status==1)
&&&&USART_1ms_Cnt++;
&&&&if(USART_1ms_Cnt&5)
&&&&&USART_SendData(USART1,0xAA);
&&&&&&USART_Rsv_Status=0;&&&&&//连续计数超过5次对USART_Rsv_Status置0,继续等待接收
&&&&&&USART_1ms_Cnt=0;&&&&&&&&
//当USART_1ms_Cnt&5时对USART_1ms_Cnt重新清零&
&&&&&&if(RbufCounter==(u16)rx_data[4]+7)&&&&&&&&&&&&&
//检验数据的完整性
//定义循环变量
&&&&&&&&int
&&&&&&&&data_length=rx_data[4];
&&&&&&&&for(i=0;i
&&&&&&&&&&data[i]=rx_data[i];
&&&&&&&&}&
&&&&&&&&CRC_data_Hi=rx_data[RbufCounter-1];
&&&&&&&&CRC_data_Lo=rx_data[RbufCounter-2];
&&&&&&&&CRC_data=CRC16((unsigned
char*)data,data_length+5);
&&&&&&&&CRC_data_Hi1=CRC_data&&8;
&&&&&&&&CRC_data_Lo1=CRC_data&0x00
&&&&&&&&&if(CRC_data_Hi==(u8)CRC_data_Hi1
&& CRC_data_Lo==CRC_data_Lo1)
&&&&&&&&&{
&&&&&&&&&&&for(j=0;rx_data[j]!='\0';j++)&&
//循环逐字输出,到结束字'\0'
&&&&&&&&&&&{&&&&&&&
&&&&&&&&&&&&&USART_SendData(USART1,
rx_data[j]);&&&&
//发送字符
&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE) == RESET)
&&&&&&&&&&&&&{
&&&&&&&&&&&&&}
//等待字符发送完毕
&&&&&&&&&&&}
&&&&&&RbufCounter=0;
&&&&}&&&&&
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved1990人阅读
A03-STM32(17)
2.1&&&&&&& 问题及现象
使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。
&&&&& for(TxCounter = 0;TxCounter & RxC TxCounter++)
&&&&&&&&&&&&& USART_SendData(USART1, RxBuffer[TxCounter]);
2.2&&&&&&& 原因
此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导致发送缓冲区的数据溢出,老的数据还未及时发送出去,新的数据又把发送缓冲区的老数据覆盖了。
2.3&&&&&&& 解决方法(目前总结的两种方案)
方案1. 加入延时函数(下下策),不需要修改USART_SendData()函数
&&&&& for(TxCounter = 0;TxCounter & RxC TxCounter++){
&&&&&&&&&&&&& USART_SendData(USART1, RxBuffer[TxCounter]);
&&&&&&&&&&&&& DelayMS(2); //加入一个小的延时
方案2. 修改USART_SendData()函数,在其内部加入发送缓冲区的USART_FLAG_TXE状态检测语句,确保一个字符完全发送出去,才进行下一个字符的发送。
实现方法:每发送一个字符都检测状态寄存器,确保数据已经发送完毕。具体操作步骤如下所示。
修改前的函数定义体
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
& /* Check the parameters */
& assert_param(IS_USART_ALL_PERIPH(USARTx));
& assert_param(IS_USART_DATA(Data));
& /* Transmit Data */
& USARTx-&DR = (Data & (u16)0x01FF);
修改后的函数定义体
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
& /* Check the parameters */
& assert_param(IS_USART_ALL_PERIPH(USARTx));
& assert_param(IS_USART_DATA(Data));
& /* Transmit Data */
& USARTx-&DR = (Data & (u16)0x01FF);
& while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符
方案3. 不修改原来的库函数,在每一个字符发送后检测状态位。
USART_SendData(USART1, RxBuffer[TxCounter]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符
ST这么做的原因是:使用发送中断功能。
本文引用通告地址:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:532307次
积分:6946
积分:6946
排名:第3273名
原创:174篇
转载:60篇
评论:66条
(1)(1)(3)(1)(1)(3)(1)(4)(1)(1)(7)(1)(4)(6)(2)(2)(2)(7)(7)(2)(2)(4)(8)(10)(3)(7)(20)(20)(1)(7)(4)(3)(4)(5)(19)(7)(2)(2)(11)(1)(13)(22)(1)(1)查看: 5135|回复: 13
USART3不能发送数据,也不能进入中断服务函数
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间0 小时
对着书看了一整天都没发现问题....求高手点拨
开发板是MiniSTM32 V3.0,下面是代码
[C] 纯文本查看 复制代码//初始化串口3,波特率9600,无奇偶校验
void Usart3_Init()
GPIO_InitTypeDef GPI;
USART_InitTypeDef USI;
NVIC_InitTypeDef NVI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB1Periph_USART3,ENABLE);
//配置IO口
GPI.GPIO_Mode=GPIO_Mode_AF_PP;
GPI.GPIO_Speed=GPIO_Speed_50MHz;
GPI.GPIO_Pin=GPIO_Pin_10; //TX
GPIO_Init(GPIOB,&GPI);
GPI.GPIO_Pin=GPIO_Pin_11; //RX
GPI.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPI);
//配置串口
// USART_DeInit(USART3);
USI.USART_BaudRate=(u32)9600;
USI.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USI.USART_WordLength=USART_WordLength_8b;
USI.USART_StopBits=USART_StopBits_1;
USI.USART_Parity=USART_Parity_No;
USI.USART_HardwareFlowControl=USART_HardwareFlowControl_N
USART_Init(USART3,&USI);
//配置接收中断
NVI.NVIC_IRQChannel=USART3_IRQn;
NVI.NVIC_IRQChannelPreemptionPriority=3;
NVI.NVIC_IRQChannelSubPriority=3;
NVI.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVI);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
//启用串口3
USART_Cmd(USART3,ENABLE);
// #ifdef DEBUG
// printf(\"InitOver\"); //测试
[C] 纯文本查看 复制代码//发送一个字符
void SendChar(u8 ch)
u16 temp=(u16)
USART_SendData(USART3,temp);
// printf(\"Sending\"); //测试
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
测试发现USART_GetFlagStatus(USART3,USART_FLAG_TC)返回值一直是0,而且TX(B10脚)上也没有电压变化
[C] 纯文本查看 复制代码//接收中断服务函数
void USART3_IRQHandler(void)
u8 temp,i;
#ifdef DEBUG
printf(\"InIRQ\"); //测试
if(USART_GetITStatus(USART3,USART_IT_RXNE))
#ifdef DEBUG
printf(\"InRXIRQ\"); //测试
temp=USART_ReceiveData(USART3);
if(temp==0xff)
for(i=0;i&i++)
printf(\"%d \",RecvBuf[i]);
delay_ms(3); //保证发送完成
RecvBuf[rpos]=
if(rpos&MAXLENGTH-1)
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
#ifdef DEBUG
printf(\"RXIRQOver\"); //测试
串口调试助手上没看见任何东西
16:19 上传
点击文件名下载附件
161 Bytes, 下载次数: 377
16:19 上传
点击文件名下载附件
1.75 KB, 下载次数: 293
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB1Periph_USART3,ENABLE);
这句错了。USART3是挂在APB1上的,你用了&RCC_APB2PeriphClockCmd就等于没有打开usart3的时钟,肯定就不能发送数据或进入中断了~
换RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
主题帖子精华
中级会员, 积分 498, 距离下一级还需 2 积分
在线时间11 小时
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB1Periph_USART3,ENABLE);
这句错了。USART3是挂在APB1上的,你用了&RCC_APB2PeriphClockCmd就等于没有打开usart3的时钟,肯定就不能发送数据或进入中断了~
换RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
请看下,你主函数中有没有初始化串口。。
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间0 小时
回复【2楼】shanyuze:
---------------------------------
delay_init(); //初始化延时函数
NVIC_Configuration(); //设置中断分组
uart_init(9600); //串口初始化,波特率为9600
usmart_dev.init(72); //USMART调试工具初始化
Key_Init();
Usart3_Init();
有的,这是主函数开头的一部分,在串口调试助手里也能看见Usart3_Init()中printf出来的内容(排查这点之后我才把printf注释掉的)
主题帖子精华
高级会员, 积分 710, 距离下一级还需 290 积分
在线时间15 小时
回复【4楼】STM32VBT6:
---------------------------------
我也有类似的疑问,我把时钟换过来后,还是不行,这是为什么? &我就是,把原子的串口实验的串口1改成串口3,时钟使能也改了,下面那些有usart1的都改成usart3了,串口那边还是没反应
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间0 小时
回复【4楼】STM32VBT6:
---------------------------------
非常感谢^_^
唉刚学不久老是漏这个漏那个的_(:з」∠)_
主题帖子精华
高级会员, 积分 710, 距离下一级还需 290 积分
在线时间15 小时
回复【6楼】mrl998:
---------------------------------
楼主你问题解决了吗?能不能发一下程序参考一下,我跟你的几乎一样的,但是串口没反应。。。我也是像你那样改原子的程序,就是不成功
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间0 小时
回复【7楼】ljjdglg520:
---------------------------------
可以,我该怎么发给你呢~
主题帖子精华
高级会员, 积分 710, 距离下一级还需 290 积分
在线时间15 小时
回复【8楼】mrl998:
---------------------------------
你可以在楼主位那里编辑一下,把文件放上去
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间0 小时
回复【9楼】ljjdglg520:
---------------------------------
好了
主题帖子精华
高级会员, 积分 710, 距离下一级还需 290 积分
在线时间15 小时
回复【10楼】mrl998:
---------------------------------
谢谢啦^_*
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
主题帖子精华
高级会员, 积分 710, 距离下一级还需 290 积分
在线时间15 小时
回复【10楼】mrl998:
---------------------------------
这么假的,你串口可以出数据吗?我初始化跟你一样的,但是串口不出数据-&-串口1就有数据,串口3就没数据
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
学习了,我新手也犯了同样的错误,调试了半天,看完帖子才知道。
主题帖子精华
新手上路, 积分 39, 距离下一级还需 11 积分
在线时间0 小时
我也是有同样的问题呀&&焦虑
Powered by}

我要回帖

更多关于 已知y关于x的函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信