基於stm32f1的lora開發基礎通信實驗


一、實驗條件

環境:
win10專業版;
keil uv5 ;
串口調試助手;
stm32f1系列單片機;
as32lora模塊(這里是澤耀科技的as32_ttl_100)

二、實現功能

1.使用定時器將底層數據通過as32每隔1秒向上層串口發送一段數據幀
2.上層串口可通過as32像底層發送數據

三、實驗講解

1.配置定時器

void Timer_Config(u16 arr,u16 psc)//1s中斷
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;				 //定義TIM結構體變量
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);	         //使能TIM2外設
    TIM_DeInit(TIM2);                                         	 //復位時鍾TIM2,恢復到初始狀態
    // 定時時間T計算公式:
    // T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(3599+1)*(99+1)/72MHz=5us
    TIM_TimeBaseStructure.TIM_Period=arr;
    TIM_TimeBaseStructure.TIM_Prescaler=psc;
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 		 //TIM2時鍾分頻
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 	 //計數方式

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); 		 		 //初始化
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);  				  		 //清除標志
    // 中斷方式下,使能中斷源
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                     //使能中斷源
    //TIM_Cmd(TIM2,ENABLE); //放MIAN里面 //使能TIM2
    // 設置優先分級組
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);            //0組,全副優先級
    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;             //選擇中斷通道,庫P166頁,
    // 選擇中斷通道。注意:固件庫中為XXX_IRQChannel,但該程序預定義為XXX_IRQn,所以要特別注意
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;    //搶占優先級0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;           //響應優先級0
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;              //啟動此通道的中斷
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM2,ENABLE);//開啟定時器
}

2.配置as引腳

void usart3_init(u32 bound)
{
    //GPIO端口設置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_ClockInitTypeDef USART_ClockInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    //USART3_TX B.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //USART3_RX B.11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);	 //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器USART1

    USART_InitStructure.USART_BaudRate = bound;
    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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    USART_ClockInit(USART3, &USART_ClockInitStructure);
    //---------------------------------------------------------------------------------
    USART_Init(USART3, &USART_InitStructure);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟中斷
    USART_Cmd(USART3, ENABLE);                    //使能串口
}

3.配置串口,串口中斷

void USART3_IRQHandler(void)
{
    u8 Res;
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)/// 接收到數據
    {
        Res =USART_ReceiveData(USART3);
        RS232_RX_BUF[RS232_RX_STA]=Res;           //讀取數據
        RS232_RX_STA++;  			//ESP_RX_STA計數,收到多少數據
			 	if(RS232_RX_STA>=6) {
            DealBufproc();
        }
        
    }
}

4.看門狗配置(防止程序跑死)

//以下是看門狗,作用是防止程序跑死(跑死程序重啟)
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能對寄存器IWDG_PR和IWDG_RLR的寫操作

    IWDG_SetPrescaler(prer);  //設置IWDG預分頻值:設置IWDG預分頻值為64

    IWDG_SetReload(rlr);  //設置IWDG重裝載值

    IWDG_ReloadCounter();  //按照IWDG重裝載寄存器的值重裝載IWDG計數器

    IWDG_Enable();  //使能IWDG
}
//喂獨立看門狗
void IWDG_Feed(void)
{
    IWDG_ReloadCounter();//reload

主函數:

int main(void)
{
    Delay_Init(72);//用定時器延時
    usart1_init(9600);
    usart3_init(9600);
   Timer_Config(4999,7199);//1s觸發一次中斷
   IWDG_Init(4,625);//看門狗溢出時間1s
    while(1)
    {
			//IWDG_Feed();//重置看門狗溢出時間
		
			Delay_100ms(5);
    }
}

四、實驗效果

上層串口調試助手實際接收數據:

底層接收數據串口1提示信息:

五、注意點

  1. 串口亂碼問題:檢查波特率和串口配置,必須十六進制顯示
  2. 串口接收數據格式:as必須采用十六進制接收和發送
  3. 數據丟失問題:as32不支持雙向通信,同時進行收發就會造成數據的丟失,可以采用as62.這個是雙向通信的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM