国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化

這篇具有很好參考價(jià)值的文章主要介紹了AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、ArduinoAPI移植

通過arduinoapi實(shí)現(xiàn)封裝,實(shí)現(xiàn)底層分離,支持arduino生態(tài),
通過固件庫模塊化外設(shè),由ArduinoAPI調(diào)用
參考FastShift的封裝方式,由于F403A固件庫升級(jí),底層需要重新封裝

一、通用定時(shí)器使用

1.計(jì)時(shí)

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件
由圖可以看出AHB時(shí)鐘為240M
定時(shí)器時(shí)鐘為240M

時(shí)間計(jì)算
Tout= ((arr+1)(psc+1))/Tclk;
Tclk:TIM3的輸入時(shí)鐘頻率(單位為MHz)。
Tout:TIM3溢出時(shí)間(單位為us)。
例:計(jì)時(shí)1ms,輸入時(shí)鐘頻率為240MHz。
??arr = 239,psc = 999。
??Tout = ((arr+1)
(psc+1))/Tclk = ((239+1) *(240+1))/240=1000(us)=1(ms)

void trm3_int_init(u16 arr, u16 psc)
{

/* enable tmr1 clock */
  crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);

  tmr_base_init(TMR3, arr, psc);
  tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
  tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);

  /* tmr1 overflow interrupt nvic init */
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_0);
  nvic_irq_enable(TMR3_GLOBAL_IRQn, 1, 0);

  /* enable tmr3 */
  tmr_counter_enable(TMR3, TRUE);  
}
 
void TMR3_GLOBAL_IRQHandler(void)
{ 		  
  TMR3->ists = 0;;
  lv_tick_inc(1);	     
}

1.

2.ETR外部時(shí)鐘計(jì)數(shù)

對(duì)于外部脈沖(方波)計(jì)數(shù),通用的方法為捕獲比較方式,由于項(xiàng)目對(duì)于脈沖的精度要求比較高,在快速搭建代碼測(cè)試過后,發(fā)現(xiàn)該方法并不能滿足需求,進(jìn)而尋求計(jì)數(shù)更為精確的方法----ETR計(jì)數(shù)。

定時(shí)器實(shí)際就是一個(gè)計(jì)數(shù)器
可選內(nèi)部、外部、內(nèi)部觸發(fā)輸入用作計(jì)數(shù)時(shí)鐘
即使用外部觸發(fā)ETR作為計(jì)數(shù)器觸發(fā)源

參考https://blog.csdn.net/u010650845/article/details/81781670

4.ArduinoAPI - timer


void Timer_SetInterrupt(TIM_TypeDef* TIMx, uint32_t Time, Timer_CallbackFunction_t Function)
{
    uint16_t period = 0;
    uint16_t prescaler = 0;
    uint32_t clock = TIMER_GET_CLOCK_MAX(TIMx);

    if(!IS_TMR_ALL_PERIPH(TIMx) || Time == 0)
    {
        return;
    }

    /*將定時(shí)中斷時(shí)間轉(zhuǎn)換為重裝值和時(shí)鐘分頻值*/
    Timer_TimeFactorization(
        Time,
        clock,
        &period,
        &prescaler
    );

    /*定時(shí)中斷配置*/
    Timer_SetInterruptBase(
        TIMx,
        period,
        prescaler,
        Function,
        TIMER_PREEMPTIONPRIORITY_DEFAULT,
        TIMER_SUBPRIORITY_DEFAULT
    );
}

三、ADC

1.ADC初始化(非DMA)


/**
  * @brief  ADC 配置
  * @param  ADCx: ADC地址
  * @retval 無
  */
void ADCx_Init(adc_type* ADCx)
{
    adc_base_config_type adc_base_struct;
    
    if(ADCx == ADC1)
    {
        crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
    }
    else if(ADCx == ADC2)
    {
        crm_periph_clock_enable(CRM_ADC2_PERIPH_CLOCK, TRUE);
    }
    else if(ADCx == ADC3)
    {
        crm_periph_clock_enable(CRM_ADC3_PERIPH_CLOCK, TRUE);
    }
    else
    {
        return;
    }

	/* select combine mode */
	adc_combine_mode_select(ADC_INDEPENDENT_MODE);
	adc_base_default_para_init(&adc_base_struct);
	adc_base_struct.sequence_mode = FALSE;
	adc_base_struct.repeat_mode = FALSE;
	adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
	adc_base_struct.ordinary_channel_length = 1;
	adc_base_config(ADCx, &adc_base_struct);
	adc_resolution_set(ADCx, ADC_RESOLUTION_12B);
	
	adc_ordinary_conversion_trigger_set(ADCx, ADC_ORDINARY_TRIG_TMR1CH1, ADC_ORDINARY_TRIG_EDGE_NONE);
	
	adc_dma_mode_enable(ADCx, FALSE);
	adc_dma_request_repeat_enable(ADCx, FALSE);
	adc_interrupt_enable(ADCx, ADC_OCCO_INT, FALSE);
	
	adc_enable(ADCx, TRUE);
	while(adc_flag_get(ADCx, ADC_RDY_FLAG) == RESET);
	
	/* adc calibration */
	adc_calibration_init(ADCx);
	while(adc_calibration_init_status_get(ADCx));
	adc_calibration_start(ADCx);
	while(adc_calibration_status_get(ADCx));

}

/**
  * @brief  獲取 ADC 值
  * @param  ADCx: ADC地址
  * @param  ADC_Channel: ADC通道
  * @retval 無
  */
uint16_t ADCx_GetValue(adc_type* ADCx, uint16_t ADC_Channel)
{
#if 0
    adc_ordinary_channel_set(ADCx, (adc_channel_select_type)ADC_Channel, 1, ADC_SAMPLETIME_47_5);

    adc_ordinary_software_trigger_enable(ADCx, TRUE);
    while(!adc_flag_get(ADCx, ADC_OCCE_FLAG));
#endif
    return adc_ordinary_conversion_data_get(ADCx);

}

2.ADC_DMA 規(guī)則通道掃描

通道注冊(cè)API

	pinMode(PWR_FWD_L_Pin, INPUT_ANALOG_DMA);
	pinMode(PWR_FWD_M_Pin, INPUT_ANALOG_DMA);
	pinMode(PWR_RET_L_Pin, INPUT_ANALOG_DMA);
	pinMode(PWR_RET_M_Pin, INPUT_ANALOG_DMA);

pinMode會(huì)調(diào)用ADC_DMA_Register

/**
  * @brief  注冊(cè)需要DMA搬運(yùn)的ADC通道
  * @param  ADC_Channel:ADC通道號(hào)
  * @retval 見ADC_DMA_Res_Type
  */
ADC_DMA_Res_Type ADC_DMA_Register(uint8_t ADC_Channel)
{
#if 1
    /*初始化ADC通道列表*/
    static bool isInit = false;
    if(!isInit)
    {
        uint8_t i;
        for(i = 0; i < ADC_DMA_REGMAX; i++)
        {
            ADC_DMA_RegChannelList[i] = 0xFF;
        }
        isInit = true;
    }

    /*是否是合法ADC通道*/
    if(!IS_ADC_CHANNEL(ADC_Channel))
        return ADC_DMA_RES_NOT_ADC_CHANNEL;

    /*是否已在引腳列表重復(fù)注冊(cè)*/
    if(ADC_DMA_SearchChannel(ADC_Channel) != -1)
        return ADC_DMA_RES_DUPLICATE_REGISTRATION;

    /*是否超出最大注冊(cè)個(gè)數(shù)*/
    if(ADC_DMA_RegCnt >= ADC_DMA_REGMAX)
        return ADC_DMA_RES_MAX_NUM_OF_REGISTRATIONS_EXCEEDED;

    /*寫入注冊(cè)列表*/
    ADC_DMA_RegChannelList[ADC_DMA_RegCnt] = ADC_Channel;

    /*注冊(cè)個(gè)數(shù)+1*/
    ADC_DMA_RegCnt++;
#endif
    return ADC_DMA_RES_OK;
}

ADC_DMA_Init函數(shù)必須放到所有ADC_DMA引腳注冊(cè)完之后

/**
* @brief  ADC DMA 配置  配置ADC和對(duì)應(yīng)DMA,固定ADC1 如果不需要DMA則使用ADCx_Init函數(shù)
  *       需要放到初始化最后,或者所有ADC_DMA引腳注冊(cè)完之后
  * @param  無
  * @retval 無
  */
void ADC_DMA_Init(void)
{

    uint8_t index;
    dma_init_type dma_init_structure;
    adc_base_config_type adc_base_struct;

    /*CLOCK CONFIG*/
    crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
    crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
    
	/*INTERUPT COFIG*/
	nvic_irq_enable(DMA1_Channel1_IRQn, 0, 0);

    /*DMA CONFIG*/
    dma_reset(DMA1_CHANNEL1);

    dma_default_para_init(&dma_init_structure);
    dma_init_structure.buffer_size = ADC_DMA_RegCnt;
    dma_init_structure.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
    dma_init_structure.memory_base_addr = (uint32_t)ADC_DMA_ConvertedValue;
    dma_init_structure.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
    dma_init_structure.memory_inc_enable = TRUE;
    dma_init_structure.peripheral_base_addr = (uint32_t) (&(ADC1->odt));
    dma_init_structure.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
    dma_init_structure.peripheral_inc_enable = FALSE;
    dma_init_structure.priority = DMA_PRIORITY_HIGH;
    dma_init_structure.loop_mode_enable = TRUE;

    dma_init(DMA1_CHANNEL1, &dma_init_structure);
	
	dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);
	
    dma_channel_enable(DMA1_CHANNEL1, TRUE);


    /*ADC CONFIG*/
	adc_combine_mode_select(ADC_INDEPENDENT_MODE);
    adc_base_default_para_init(&adc_base_struct);

    adc_base_struct.sequence_mode = TRUE;
    adc_base_struct.repeat_mode = TRUE;
    adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
    adc_base_struct.ordinary_channel_length = ADC_DMA_RegCnt;
    adc_base_config(ADC1, &adc_base_struct);


    for(index = 0; index < ADC_DMA_RegCnt; index++)
    {
        adc_ordinary_channel_set(
            ADC1,
            (adc_channel_select_type)ADC_DMA_RegChannelList[index],
            index + 1,
            ADC_SAMPLETIME_41_5
        );
    }

  
    adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
    adc_dma_mode_enable(ADC1, TRUE);
  
 
    adc_enable(ADC1, TRUE);
    adc_calibration_init(ADC1);
    while(adc_calibration_init_status_get(ADC1));
    adc_calibration_start(ADC1);
    while(adc_calibration_status_get(ADC1));

}

兩種方式 :1 DMA完成中斷中再次軟件觸發(fā),實(shí)現(xiàn)循環(huán)采樣,中斷頻率較高
2 ADC_DMA_GetValue中軟件觸發(fā),需要獲取數(shù)據(jù)時(shí)才開啟采集
通過CONFIG_ADC_CIRCLE_ENABLE 進(jìn)行切換

void DMA1_Channel1_IRQHandler(void)
{
  if(dma_flag_get(DMA1_FDT1_FLAG) != RESET)
  {
    dma_flag_clear(DMA1_FDT1_FLAG);
   
	  
#if (CONFIG_ADC_CIRCLE_ENABLE == 1)
	adc_ordinary_software_trigger_enable(ADC1, TRUE);
#else
	   dma_trans_complete_flag = 1;
#endif
  }
}

/**
  * @brief  獲取DMA搬運(yùn)的ADC值
  * @param  ADC_Channel:ADC通道號(hào)
  * @retval ADC值
  */
uint16_t ADC_DMA_GetValue(uint8_t ADC_Channel)
{
    int16_t index;

    if(!IS_ADC_CHANNEL(ADC_Channel))
        return 0;

    index = ADC_DMA_SearchChannel(ADC_Channel);
    if(index == -1)
        return 0;

#if (CONFIG_ADC_CIRCLE_ENABLE == 0) 
	adc_ordinary_software_trigger_enable(ADC1, TRUE);
	while(dma_trans_complete_flag == 0);
	dma_trans_complete_flag = 0;
#endif
	
    return ADC_DMA_ConvertedValue[index];
}

六、USB HID IAP

1.準(zhǔn)備好Bootloader和app

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件

2.配置好時(shí)鐘,一定要打開USB

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件

3.將生成的時(shí)鐘配置復(fù)制到bootloader和app對(duì)應(yīng)位置

設(shè)置正確才能正確識(shí)別HID設(shè)備,并且免驅(qū),否則無法識(shí)別usb

void system_clock_config(void)
{
   /* reset crm */
  crm_reset();

  /* enable hext */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

   /* wait till hext is ready */
  while(crm_hext_stable_wait() == ERROR)
  {
  }


  /* config pll clock resource */
  crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_15, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

  /* enable pll */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  /* wait till pll is ready */
  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  {
  }


  /* config ahbclk */
  crm_ahb_div_set(CRM_AHB_DIV_1);

  /* config apb2clk */
  crm_apb2_div_set(CRM_APB2_DIV_2);

  /* config apb1clk */
  crm_apb1_div_set(CRM_APB1_DIV_2);

  /* enable auto step mode */
  crm_auto_step_mode_enable(TRUE);


  /* select pll as system clock source */
  crm_sysclk_switch(CRM_SCLK_PLL);

  /* wait till pll is used as system clock source */
  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  {
  }


  /* disable auto step mode */
  crm_auto_step_mode_enable(FALSE);


  /* update system_core_clock global variable */
  system_core_clock_update();
}

4 設(shè)置bootloader和app的起始位置

bootloader
AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件

app
AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件
AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件
保持一致

5 使用IAP Programmer下載,地址要設(shè)置為app地址

AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化,# AT32,單片機(jī),嵌入式硬件文章來源地址http://www.zghlxwxcb.cn/news/detail-715036.html

到了這里,關(guān)于AT32固件庫外設(shè)使用,ArduinoAPI接口移植,模塊化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [GD32F4]基于GD32固件庫移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件庫移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件庫移植cherryusb[STM32F4] 使用開發(fā)板是淘寶買的不知名開發(fā)板,沒什么好說的,具體的型號(hào)是GD32F450VET6。 使用的cherryusb版本是0.9.0版本。 使用的GD32官方固件庫版本是:GD32F4xx_Firmware_Library_V3.0.4 cherryusb最牛的地方在于拋棄掉所有的依賴,只需要知道芯片的usb中斷

    2024年02月06日
    瀏覽(69)
  • STM32 + ESP32(AT固件 MQTT協(xié)議) + MQTTX(桌面終端) + (EMQX消息服務(wù)器)

    STM32 + ESP32(AT固件 MQTT協(xié)議) + MQTTX(桌面終端) + (EMQX消息服務(wù)器)

    翻出老物件,搭建一個(gè)簡單的 IOT 開發(fā)環(huán)境,也算是廢物利用了?,接下來加傳感器。 1. STM32? 采集數(shù)據(jù): ? ? ?RTOS。 ? ? ?資源相對(duì)比較豐富,可以根據(jù)項(xiàng)目需求定制。 2. ESP32? 網(wǎng)絡(luò)傳輸(AT固件 MQTT協(xié)議)?: ? ? AT:封裝好的接口,擴(kuò)展性不是那么好,業(yè)務(wù)簡單的話將就可以

    2024年02月08日
    瀏覽(27)
  • 【STM32+ESP8266上云連載①】給ESP8266燒錄AT固件

    【STM32+ESP8266上云連載①】給ESP8266燒錄AT固件

    我在使用ESP8266的時(shí)候遇到了一些問題,像給固件燒錄、和單片機(jī)結(jié)合使用MQTT協(xié)議給云服務(wù)器發(fā)送數(shù)據(jù)等。樂鑫有提供基礎(chǔ)的AT固件,可以正常使用模組的一些基本的功能,但是針對(duì)MQTT協(xié)議需要燒錄專門的固件使用。因此,我將自己解決遇到的問題解決方法寫一下,希望可以

    2024年02月11日
    瀏覽(26)
  • ESP32 官方AT固件編譯(從零開始環(huán)境搭建到編譯完成全過程)

    ESP32 官方AT固件編譯(從零開始環(huán)境搭建到編譯完成全過程)

    https://download3.vmware.com/software/WKST-PLAYER-1702/VMware-player-full-17.0.2-21581411.exe https://releases.ubuntu.com/jammy/ubuntu-22.04.2-desktop-amd64.iso 可能需要進(jìn)電腦的BIOS打開一個(gè)選項(xiàng)才能安裝成功虛擬機(jī) 5.1 GIT 克隆 git clone --recursive https://github.com/espressif/esp-at.git 如果沒有安裝git,按照控制臺(tái)的提示安

    2024年02月15日
    瀏覽(46)
  • STM32發(fā)送數(shù)據(jù)ESP8266固件燒錄MQTT和AT指令調(diào)試與鏈接OneNET

    STM32發(fā)送數(shù)據(jù)ESP8266固件燒錄MQTT和AT指令調(diào)試與鏈接OneNET

    STM32連接ESP8266發(fā)送數(shù)據(jù)到OneNET平臺(tái) 1.硬件型號(hào):ESP8266-01s 和 USBTTL轉(zhuǎn)接口模塊 2.固件:1471_esp8266-at_mqtt-1m(MQTT透?jìng)鰽T固件(固件號(hào):1471)) 3.固件燒錄工具:flash_download_tool_3.9.4 固件下載和燒錄工具均可在安信可官網(wǎng)下載安信可AT固件下載 本文章使用的是XCOM V2.6 串口助手 4.On

    2024年02月04日
    瀏覽(41)
  • STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼) --3. STM32硬件連接+keil代碼修改

    STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼) --3. STM32硬件連接+keil代碼修改

    提示:這里是從實(shí)際應(yīng)用如何使用教學(xué)配置,未從原理講解,適合小白從零開始到成功,比較有成就感 STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng)系列保姆級(jí)教學(xué) 1. 創(chuàng)建產(chǎn)品和設(shè)備 2. 設(shè)置產(chǎn)品Topic數(shù)據(jù)和功能定義設(shè)備物模型數(shù)據(jù)顯示 3. 硬件連接+代碼修改 4. Web數(shù)據(jù)可視化 5.功能

    2024年02月05日
    瀏覽(26)
  • STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼)--1.創(chuàng)建產(chǎn)品和設(shè)備

    STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼)--1.創(chuàng)建產(chǎn)品和設(shè)備

    提示:這里是從實(shí)際應(yīng)用如何使用教學(xué)配置,未從原理講解,適合小白從零開始到成功,比較有成就感 STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng)系列保姆級(jí)教學(xué) 1. 創(chuàng)建產(chǎn)品和設(shè)備 2. 設(shè)置產(chǎn)品Topic數(shù)據(jù)和功能定義設(shè)備物模型數(shù)據(jù)顯示 3. 硬件連接+代碼修改 4. Web數(shù)據(jù)可視化 5.功能

    2024年04月25日
    瀏覽(62)
  • Espressif樂鑫AT固件庫使用全梳理

    Espressif樂鑫AT固件庫使用全梳理

    寫在前面: 當(dāng)你遇到一件麻煩事的時(shí)候,你要做的就是乖乖聽它的話,別再自找麻煩。 ? ESP-IDF手冊(cè) ESP-AT手冊(cè) esp-dev-kits開發(fā)板手冊(cè) 不推薦使用esclipse和vscode插件,除非你經(jīng)常用這兩個(gè),對(duì)它們很熟悉,而且下載插件時(shí)可能需要外部上網(wǎng) 推薦使用樂鑫官方的IDF和IDE,參考見

    2024年02月16日
    瀏覽(13)
  • STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼)--4. Web數(shù)據(jù)可視化

    STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級(jí)教學(xué)(附代碼)--4. Web數(shù)據(jù)可視化

    提示:這里是從實(shí)際應(yīng)用如何使用教學(xué)配置,未從原理講解,適合小白從零開始到成功,比較有成就感 STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng)系列保姆級(jí)教學(xué) 1. 創(chuàng)建產(chǎn)品和設(shè)備 2. 設(shè)置產(chǎn)品Topic數(shù)據(jù)和功能定義設(shè)備物模型數(shù)據(jù)顯示 3. 硬件連接+代碼修改 4. Web數(shù)據(jù)可視化 5.功能

    2024年04月10日
    瀏覽(27)
  • STM32移植LVGL+旋轉(zhuǎn)編碼器接口對(duì)接

    STM32移植LVGL+旋轉(zhuǎn)編碼器接口對(duì)接

    寫在前面:本菜鳥結(jié)合了許多大佬的文章,成功實(shí)現(xiàn)了基于LVGL的GUI設(shè)計(jì),小開心~淺淺記錄一下!~ 本文以單片機(jī)STM32F103VET6為核心,利用ST7796芯片驅(qū)動(dòng)分辨率為480*320的LCD液晶屏模塊,移植LVGL,對(duì)接顯示接口,對(duì)接外部接口——旋轉(zhuǎn)編碼器,完成以上兩步,就可以實(shí)現(xiàn)LVGL的顯

    2024年02月10日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包