久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1653|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

機(jī)智云程序移植到合泰單片機(jī)HT32F52352上

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:729078 發(fā)表于 2021-6-28 18:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、    WiFi模塊燒錄機(jī)智云的固件

WiFi模塊用的是正點(diǎn)原子的ATK-ESP-01,F(xiàn)lash的大小是8Mbit,機(jī)智云對(duì)應(yīng)的固件可在此下載。

   

如點(diǎn)擊資源下載沒有反應(yīng),則在資源下載處右鍵,選擇這三個(gè)中的任意一個(gè)都可下載。


WiFi模塊的連接如下,



解壓剛剛下載的固件包,用ESPFlashDownloadTool直接下載GAgent_00ESP826_04020034_8MbitUser1_combine_201806091441.bin文件即可,下載地址0x0000,F(xiàn)lash大小選擇8Mbit,選擇對(duì)應(yīng)的COM口。

之后點(diǎn)擊START即可開始下載,若一直處于等待上電同步,則將RST引腳接地再斷開即可解決。


二、下載系統(tǒng)的代碼包

1、創(chuàng)建新產(chǎn)品

產(chǎn)品分類隨意,技術(shù)方案選擇WiFi/移動(dòng)網(wǎng)絡(luò)方案



2、創(chuàng)建數(shù)據(jù)點(diǎn)

產(chǎn)品信息——>數(shù)據(jù)點(diǎn)



3、下載與之匹配的代碼包

服務(wù)——>MCU開發(fā)——>硬件方案:獨(dú)立MCU方案——>硬件平臺(tái):其他平臺(tái)——>填入Product Secret——>生成代碼包

之后下載即可!

三、新建一個(gè)USART文件和一個(gè)TIMER文件

1、我們需要用一個(gè)USART口與wifi模塊通信從而將 wifi 串口接收到數(shù)據(jù)寫入到緩沖區(qū)中,同時(shí)將數(shù)據(jù)上傳到云端。

合泰的HT32F52352有4個(gè)串口,2個(gè)USART(通用同步異步收發(fā)器)和2個(gè)UART(通用異步收發(fā)器);我選的是USART1,串口的波特率必須是9600.

(以下是移植好后的usart.c文件)


#include "usart.h"#include"delay.h"#include "ht32f52352_sk.h"#include"ht32_board_config.h"#include "gizwits_protocol.h"
//C庫#include<stdarg.h>
/* Global variables----------------------------------------------------------------------------------------*/uc8  *gURTx_Ptr;vu32 gURTx_Length = 0;u8  *gURRx_Ptr;vu32 gURRx_Length = 0;vu32gURRx_RElength=0;vu32 gIsTxFinished = FALSE;
/* Private variables---------------------------------------------------------------------------------------*/uc8gHelloString[] = "Hello, this is USART Tx/Rx FIFO example. Please enter 5characters...\r\n";u8 gTx_Buffer[128];u8 gRx_Buffer[128];
//USART0初始化void USART0_Configuration(void){  gURRx_Ptr = gRx_Buffer;
  #if 0  CKCU_SetPeripPrescaler(CKCU_PCLK_UxARTn, CKCU_APBCLKPRE_DIV2);  #endif
  {   CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};    CKCUClock.Bit.AFIO = 1;    CKCUClock.Bit.PA=1;    CKCUClock.Bit.USART0=1;    CKCU_PeripClockConfig(CKCUClock,ENABLE);  }
  GPIO_PullResistorConfig(HT_GPIOA,GPIO_PIN_3, GPIO_PR_UP);
  AFIO_GPxConfig(USART_GPIO_GROUP,USART_TX_PIN, AFIO_FUN_USART_UART); AFIO_GPxConfig(USART_GPIO_GROUP, USART_RX_PIN, AFIO_FUN_USART_UART);
  USART_InitTypeDefUSART_InitStructure={0};  
  USART_InitStructure.USART_BaudRate =115200; USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;  USART_InitStructure.USART_StopBits =USART_STOPBITS_1; USART_InitStructure.USART_Parity = USART_PARITY_NO;  USART_InitStructure.USART_Mode =USART_MODE_NORMAL;  USART_Init(COM0_PORT,&USART_InitStructure);
  NVIC_EnableIRQ(COM0_IRQn);   //Enable 中斷設(shè)置
  USART_IntConfig(COM0_PORT,USART_INT_RXDR , ENABLE);// Enable UxART Tx and Rx interrupt
  USART_TxCmd(COM0_PORT, ENABLE); // 使能 COM1_PORT  發(fā)送和接收  USART_RxCmd(COM0_PORT,ENABLE);  }
//USART0中斷函數(shù)void USART0_IRQHandler(void){  if(USART_GetFlagStatus(COM0_PORT ,USART_FLAG_RXDR) != RESET) //接收中斷  {   if(gURRx_Length >= sizeof(gRx_Buffer))  gURRx_Length = 0; //防止串口被刷爆    gRx_Buffer[gURRx_Length++]= COM0_PORT->DR;
    USART_ClearFlag(COM0_PORT,USART_FLAG_RSADD);  }}
//USART1初始化void USART1_Configuration(void){  CKCU_PeripClockConfig_TypeDef CKCUClock={{0}};  CKCUClock.Bit.AFIO = 1;  CKCUClock.Bit.PA=1;  COM1_CLK(CKCUClock)  = 1; //開啟COM0 時(shí)鐘  CKCU_PeripClockConfig(CKCUClock, ENABLE);
  GPIO_PullResistorConfig(HT_GPIOA,GPIO_PIN_5, GPIO_PR_UP);
  AFIO_GPxConfig(USART1_GPIO_GROUP,USART1_TX_PIN, AFIO_FUN_USART_UART); AFIO_GPxConfig(USART1_GPIO_GROUP, USART1_RX_PIN, AFIO_FUN_USART_UART);
  USART_InitTypeDefUSART_InitStructure={0};
  USART_InitStructure.USART_BaudRate =9600; //波特率必須是9600 USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;  USART_InitStructure.USART_StopBits =USART_STOPBITS_1; USART_InitStructure.USART_Parity = USART_PARITY_NO;  USART_InitStructure.USART_Mode =USART_MODE_NORMAL;  USART_Init(COM1_PORT,&USART_InitStructure);
  NVIC_EnableIRQ(COM1_IRQn);   //Enable 中斷設(shè)置      USART_IntConfig(COM1_PORT, USART_INT_RXDR, ENABLE);// Enable UxART Tx and Rx interrupt
  USART_TxCmd(COM1_PORT, ENABLE); // 使能 COM1_PORT  發(fā)送和接收   USART_RxCmd(COM1_PORT,ENABLE);
}
//USART1中斷服務(wù)函數(shù)void USART1_IRQHandler(void){  uint8_t res; if(USART_GetFlagStatus(COM1_PORT , USART_FLAG_RXDR) != RESET) //接收中斷  {    res =USART_ReceiveData(COM1_PORT);         gizPutData(&res, 1);//數(shù)據(jù)寫入到緩沖區(qū)    USART_ClearFlag(COM1_PORT,USART_FLAG_RSADD);  }}

//UsartPrintf函數(shù),相當(dāng)于printfvoidUsartPrintf(HT_USART_TypeDef* USARTx, char *fmt,...){  unsigned char UsartPrintfBuf[296];  va_list ap; unsigned char *pStr = UsartPrintfBuf;
  va_start(ap, fmt);  vsnprintf((char *)UsartPrintfBuf,sizeof(UsartPrintfBuf), fmt, ap);              //格式化  va_end(ap);
  while(*pStr != 0)  {   USART_SendData(USARTx, *pStr++);   while(USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET);  }
}


2、協(xié)議層的運(yùn)行需要一個(gè)系統(tǒng)時(shí)間,事件單位為毫秒,所以我們需要用用定時(shí)器來實(shí)現(xiàn)1ms的精準(zhǔn)定時(shí)。
HT32F52352有5個(gè)定時(shí)器,他們是MCTM(馬達(dá)控制定時(shí)器)、GPTM(PWM產(chǎn)生和捕捉定時(shí)器)、SCTM(單通道產(chǎn)生與捕捉定時(shí)器 )、BFTM(基本功能定時(shí)器)、 WDT(看門狗定時(shí)器),實(shí)現(xiàn)1ms的精準(zhǔn)定時(shí)我們選用BFTM即可。
(以下是移植好后的TIMER.c文件)


#include "TIMER.h"#include"ht32f5xxxx_bftm.h"#include "gizwits_product.h"


void Timer_Init(void){   CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};  CKCUClock.Bit.BFTM1 = 1;  //開啟中斷時(shí)鐘 CKCU_PeripClockConfig(CKCUClock, ENABLE);
  NVIC_EnableIRQ(BFTM1_IRQn);
  BFTM_SetCounter(HT_BFTM1, 0);//  BFTM_SetCompare(HT_BFTM1, SystemCoreClock);//定時(shí)1s產(chǎn)生中斷 BFTM_SetCompare(HT_BFTM1, SystemCoreClock*1000);//定時(shí)1ms產(chǎn)生中斷 BFTM_IntConfig(HT_BFTM1, ENABLE);//使能中斷  BFTM_EnaCmd(HT_BFTM1, ENABLE);//使能BFTM
}
void BFTM1_IRQHandler(void){if(BFTM_GetFlagStatus(HT_BFTM1)!=RESET)    {     BFTM_ClearFlag(HT_BFTM1);//清除中斷標(biāo)志      gizTimerMs();          } }


四、開始移植

product.c文件中:

1、將Timer、usart、Gizwits、Utils四個(gè)文件夾加到工程里去


2、由于我們把定時(shí)中斷服務(wù)函數(shù)和串口接收中斷函數(shù)都放到對(duì)應(yīng)的文件里面了,所以要?jiǎng)h除product.c文件里的:

TIMER_IRQ_FUN函數(shù)

UART_IRQ_FUN函數(shù)


3、UartWrite函數(shù)里添加串口發(fā)送函數(shù)

(需要自行添加上頭文件ht32f5xxxx_usart.h)

int32_tuartWrite(uint8_t *buf, uint32_t len){   uint32_t i = 0;
    if(NULL == buf)    {       return -1;    }
    #ifdef PROTOCOL_DEBUG   GIZWITS_LOG(COM0_PORT,"MCU2WiFi[%4d:%4d]: ",gizGetTimerCount(), len);    for(i=0;i<len; i++)    {        GIZWITS_LOG(COM0_PORT,"%02x", buf);    }    GIZWITS_LOG(COM0_PORT,"\n");    #endif
    for(i=0; i<len; i++)    {       USART_SendData(COM1_PORT, buf);//使用USART1進(jìn)行數(shù)據(jù)的讀寫   while(USART_GetFlagStatus(COM1_PORT,USART_FLAG_TXDE)==RESET);
        //Serial port to achieve thefunction, the buf sent to the module       if(i >=2 && buf == 0xFF)        {          //Serial port to achieve thefunction, the 0x55 sent to the module         USART_SendData(COM1_PORT, 0x55);//使用USART1進(jìn)行數(shù)據(jù)的讀寫     while(USART_GetFlagStatus(COM1_PORT,USART_FLAG_TXDE)==RESET);        }   }


    return len;}
4、mcuReset中添加軟件復(fù)位函數(shù)
void mcuRestart(void){    NVIC_SystemReset();                                                  }

PS:
合泰的這款M0單片機(jī)實(shí)現(xiàn)軟件復(fù)位的方法就是把SCB_AIRCR寄存器的SYSRESETREQ位置1.并且軟件復(fù)位和硬件復(fù)位不一樣,軟件復(fù)位不需要進(jìn)行FPGA、DSP等的加載,只是一些配置芯片的初始化。軟件復(fù)位一般是一些塊結(jié)構(gòu),硬件復(fù)位的作用區(qū)域一般是全局的。
void software_reset(void) {     __DSB();   //防止數(shù)據(jù)丟失                                                          SCB->AIRCR  = ((0x5FA <<SCB_AIRCR_VECTKEY_Pos)      |  //用0x5FA這個(gè)密碼開啟這個(gè)寄存器的鎖                  SCB_AIRCR_SYSRESETREQ_Msk);                //SYSRESETREQ置1實(shí)現(xiàn)復(fù)位
  __DSB();   //防止數(shù)據(jù)丟失                                                     while(1);                                                   }
5、UserInit函數(shù)里寫初始化
void userInit(void){   memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//設(shè)備結(jié)構(gòu)體初始化    gizwitsInit();//緩沖區(qū)初始化 gizwitsSetMode(WIFI_AIRLINK_MODE); //AirLink方式接入}

6、UserHandle里寫入數(shù)據(jù)上報(bào)處理語句
(數(shù)據(jù)上行,單片機(jī)上報(bào)數(shù)據(jù))
void userHandle(void){    if(wifi_sta)  {       currentDataPoint.valuelight_wave_1=200;    }}

7、GizwitsEventProcess函數(shù)里寫入控制語句

(數(shù)據(jù)下行,手機(jī)下發(fā)控制指令)
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t*gizdata, uint32_t len){  uint8_t i =0;  dataPoint_t *dataPointPtr =(dataPoint_t *)gizdata; moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;  protocolTime_t *ptime = (protocolTime_t *)gizdata;
//#if MODULE_TYPE//  gprsInfo_t*gprsInfoData = (gprsInfo_t *)gizdata;//#else// moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;//#endif
  if((NULL == info) || (NULL ==gizdata))  {    return -1; }
  for(i=0; i<info->num; i++)  {   switch(info->event)   {      case EVENT_func_1:        currentDataPoint.valuefunc_1 =dataPointPtr->valuefunc_1;       GIZWITS_LOG(COM0_PORT,"Evt: EVENT_func_1 %d \n",currentDataPoint.valuefunc_1);       if(0x01 == currentDataPoint.valuefunc_1)        {         led_on(LED1_GPIO_PIN); //點(diǎn)亮LED1        }       else        {          led_off(LED1_GPIO_PIN); //關(guān)閉LED1        }        break;        ......

common.h文件中
由于我的usatrt.c文件里用的是UsartPrintf函數(shù)而不是printf函數(shù),因此需要將common.h文件中的
#define GIZWITS_LOG printf
修改為:
#define GIZWITS_LOG UsartPrintf
并修改product.c和protocol.c文件里對(duì)應(yīng)的語句
五、修改main.c文件
1、添加usart、timer、Gizwits的初始化
2、while函數(shù)里進(jìn)行數(shù)據(jù)處理并上報(bào)
#include "ht32.h"
#include "usart.h"
#include "Delay.h"
#include "led.h"
#include "TIMER.h"
#include "gizwits_product.h"
dataPoint_t currentDataPoint;
uint8_t wifi_sta=0;
static void delay(u32 nCount)
{
vu32 i;
for (i = 0; i < 10000 * nCount; i++){}
}
int main(void)
{
LED_Init();              //LED初始化
led_off(LED1_GPIO_PIN);  //關(guān)閉LED1
USART0_Configuration();  //USART0初始化
USART1_Configuration();  //USART1初始化
Timer_Init();            //MS定時(shí)初始化
userInit();     //Gizwits初始化
while(1)
{
   userHandle();  
   gizwitsHandle((dataPoint_t *)¤tDataPoint); //上報(bào)數(shù)據(jù)  
}
}


到此程序的移植就完成了,可以下載機(jī)智云的APP看一看效果!
————————————————
版權(quán)**:本文為CSDN博主「劉一五」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本**。
原文鏈接:https://blog.csdn.net/Jessaly/article/details/113817938

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色www精品视频在线观看 | 色偷偷888欧美精品久久久 | 国产精品一区二区在线 | 婷婷综合激情 | 亚洲精品自在在线观看 | 免费在线观看h片 | 日韩精品一区二 | 国产精品欧美一区二区三区不卡 | 亚洲视频在线观看免费 | 99re99| 狠狠干天天干 | 午夜精品久久久久久久久久久久久 | 欧美一区2区三区4区公司二百 | 福利片在线观看 | 亚洲欧美一区二区三区国产精品 | 在线视频一区二区 | 国产精品福利在线观看 | 中文字幕一区二区三区四区五区 | 精品96久久久久久中文字幕无 | 久久精品国产一区老色匹 | 日韩中文一区二区 | 国产免费一区二区 | 免费a国产 | 欧美国产精品一区二区三区 | 蜜桃视频在线观看www社区 | 国产乱性| 成人在线精品视频 | 久久中文字幕av | 欧美日韩中 | 亚洲国产精品久久久久婷婷老年 | 欧美日韩综合精品 | 日韩三区在线观看 | 日本在线播放一区二区 | 在线国产99 | 福利网站在线观看 | 狠狠干天天干 | 久久精品电影 | 国产精品自产拍在线观看蜜 | 亚洲精品在线看 | 中文字幕日韩一区 | 国产精品久久 |