while(1)
{
delay(1);
uart1_putstring("AT+CIMI\r\n");
delay(10);
for(i=0;i<50;i++)
{
if (strstr(uart_buf, "AT+CIMI")&& strstr(uart_buf, "OK"))
{
i=5;
break;
}
}
if(i==5)break;
}
去掉while(1)试试,变成如下:
void main(void)
{
uint8 i;
uart0_init(); // 串口初始化
gsm_init(); // TC35初始化
EA = 1; // 使能中断
while(1)
{
IGT = 1;
delay(100);
IGT = 0;
delay(100);
IGT = 1;
delay(100);
delay(100);
// 检测TC35是否启动
break;
}
delay(1);
uart1_putstring("AT+CIMI\r\n");
delay(10);
for(i=0;i<50;i++)
{
if (strstr(uart_buf, "AT+CIMI")&& strstr(uart_buf, "OK"))
{
i=5;
break;
}
}
if(i==5)break;
LED2 = 1;
uart0_flush_buf ();
uart1_flush_buf();
gsm_send_back("AT\r\n");
gsm_send_back("AT+CMGF=1\r\n");
gsm_send_back("AT+CSMP=17,167,0,0\r\n");
gsm_send_back("AT+CSCS=GSM\r\n");
gsm_send_back("AT+CMGS=13645168751\r\n");
gsm_send_back("hello\x01A");
}//对应主函数
应该是可以的,我最近在做个项目也是用的这个单片机,下面是一些初始化:/
;函数名: void Uart1_Init(void)
;功能: 串口初始化
;是否测试通过:
/
void Uart1_Init(void) //9600bps@110592MHz
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
// AUXR =0X00;
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/
;函数名: void Uart2_Init(void)
;功能: 串口初始化
;是否测试通过:
/
void Uart2_Init(void) //9600bps@110592MHz
{
S2CON=0X50;
AUXR1=0X00; //TXD2-P13 RXD2-P12
AUXR=0X10; //允许独立波特率
BRT=0xfd; //独立波特率
}
/
;函数名: Time0_Set()
;功能: 定时器0 初始化 作PWM频率输出
;是否测试通过:测试通过
/
void Time0_Set()
{
TMOD= 0x22;
TH0= 0xe8; // 对应hz输出
TL0= 0xe8;
TR0=1;
}
你也可以去这个网址找你要的>
英语的缩写重复率很高,建议楼主以后要说明是哪一类的所写。
EMI:电磁波会与电子元件作用,产生干扰现象,称为EMI(Electromagnetic Interference),就是电磁干扰。例如,TV荧光屏上常见的“雪花”便表示接受到的讯号被干扰。
KBS:kilobits(千比特)
HC:1、SGS电子元件公司(意大利)在半导体元件上的缩写;
2、碳氢的英文缩写;
3、Host Controller,主体控制处理
UART1:UART (Universal Asynchronous Receiver/Transmitter) 通用异步收发器UART是用于控制计算机与串行设备的芯片。1就是指1号芯片
PWM:脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。
SCTU:螺旋CT泌尿系成像spiral CT urography(SCTU)。SCTU可多方位观察输尿管病变,可从二维及三维立体图像上获得更多诊断信息。与静脉泌尿系造影(IVU)相比,有明显优越性。
SSCU:SSCU (subsystem control unit),分支系统控制单元。电子术语。
实验室项目需要使用STM32开发,Hal库的资料相对较少,关于UART中断与之前使用飞思卡尔芯片的中断不同。
首先在CubeMX中配置好UART中断;重点是:需要在主循环之前手动开启接收中断:
只有手动开启之后才能进入中断。
此外,HAL库中,无论何种类型的UART中断,都会进入:
在此函数中判断具体是何种中断,再调用相应的中断服务函数,接收中断是:
而此函数会调用:
最需要注意的一点是:
在回调函数最后需要再次开启中断!!否则只能执行一次!!
个人理解 这里将中断服务设置为等待模式 等待接收字符。
在Keil中进行断点调试 发现接受字符后会首先进入
HAL_UART_IRQHandler
函数,而不是直接进入 UART_Receive_IT 函数进行处理
相当于UART中断服务程序有一个统一入口
HAL_UART_Receive_IT(&huart1, (uint8_t )aRxBuffer, 1) 语句相当于打开这个入口,经测试如果去掉这句的话,再发送字符是不会进入HAL_UART_IRQHandler语句的。
刚开始接触STM32与HAL库函数,理解肯定不是很到位。
参考自:
>
extern void UART1_send_byte(uint8_t byte)
{
while(!((USART1->ISR)&(1<<7)));
USART1->TDR=byte;
}
extern volatile uint8_t USART_Data = 0;
extern void USART1_IRQHandler(void)
{
if((USART1->ISR & USART_ISR_TC) == USART_ISR_TC)
{
USART1->ICR |= USART_ICR_TCCF;/ clear transfer complete flag /
}
else if((USART1->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)
{
USART_Data = USART1->RDR;/ receive data, clear flag /
}
else
{
NVIC_DisableIRQ(USART1_IRQn);/ Disable USART1_IRQn /
}
}
上面的代码是可以的,我用仿真器和逻辑分析仪查过,都是没问题的。
但是对着改USART2就是不行,用逻辑分析仪看,TX都没有输出信号。试过做回环测试,发不出数据,自然也不会收到数据,也就进不了接受中断。
int main(void)
{
unsigned char i = 3;
USART2_Configuration();
while (1)
{
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
UART2_send_byte(i ++);
}
}
extern void USART2_Configuration(void)//′ú3êˉoˉêy
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_SetPriority(USART2_IRQn, 0); / (4) /
NVIC_EnableIRQ(USART2_IRQn); / (5) /
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
/
USART2_TX -> PA2 , USART2_RX -> PA3
/
GPIO_InitStructureGPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructureGPIO_OType = GPIO_OType_PP;
GPIO_InitStructureGPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructureUSART_BaudRate = 115200;//éè′ú2¨ìê
USART_InitStructureUSART_WordLength = USART_WordLength_8b;//éèêyY
USART_InitStructureUSART_StopBits = USART_StopBits_1;//éèí£1
USART_InitStructureUSART_Parity = USART_Parity_No;//éèD§é
USART_InitStructureUSART_HardwareFlowControl = USART_HardwareFlowControl_None;//éèá÷
USART_InitStructureUSART_Mode = USART_Mode_Rx | USART_Mode_Tx;//éè1¤×÷£ê
USART_Init(USART2, &USART_InitStructure); //èá11ì
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
USART_Cmd(USART2, ENABLE);//ê1ü′ú1
}
extern void UART2_send_byte(uint8_t byte)
{
while(!((USART2->ISR)&(1<<7)));
USART2->TDR=byte;
}
extern volatile uint8_t USART_Data = 0;
extern void USART2_IRQHandler(void)
{
if((USART2->ISR & USART_ISR_TC) == USART_ISR_TC)
{
USART2->ICR |= USART_ICR_TCCF;/ clear transfer complete flag /
}
else if((USART2->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)
{
USART_Data = USART2->RDR;/ receive data, clear flag /
}
else
{
NVIC_DisableIRQ(USART2_IRQn);/ Disable USART1_IRQn /
}
}
加上:
USART_DeInit(USART1);
USART_DeInit(USART2);
一般是程序问题,你可以从以下几点进行检查:
首先当然是tim的初始化,是否设置正确;GPIO是否设置为复用输出;Tim3和GPIO的时钟是否使能。引脚的主功能是否被初始化了时钟(这一点为方便理解,给你举个例子,假如这个引脚有UART1的功能,这个引脚的复用功能是TIM3,那么你就不能初始化UART1的时钟,否则会造成TIM3复用失败)。
楼主,你好。你有没有用串口助手或者示波器测试你的UART1引脚,是否有数据出来?在发送的时候,这个寄存器应该是write-only的,所以你使用寄存器查看是看不出来的。你需要测试你的串口数据,以及UART引脚是否有数据发出。 查看更多答案>>
以上就是关于单片机+GSM模块,上电发短信一直在发,如何只发一条全部的内容,包括:单片机+GSM模块,上电发短信一直在发,如何只发一条、STC12C5A60S2单片机 双串口,请问 两个串口能同时使用独立波特率发生器吗如果有这方面编程的例子、EMI ,KBS, HC, UART1,PWM,SCTU,SSCU是什莫意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)