0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ubuntu下編程——杰發(fā)科技AC7802x串口控制LED燈

華仔的編程隨筆 ? 2023-06-04 16:46 ? 次閱讀

ubuntu20.04+vscode下對杰發(fā)科技的AC7802x Cortex-M0+進行編程、編譯、下載等。

開發(fā)板

開發(fā)板為杰發(fā)科技的AC780x,板載的主控芯片為AC78022,32PIN。內核為Cortex-M0+。

image.png

流程圖

image.png

控制部分的原理圖

1、本次實驗選用LED1來實現(xiàn)燈的開與關。原理圖如下:

image.png

image.png

從原理圖上看,LED1控制IO接到PA2,高電平制三極管導通,LED1亮,反之則關斷。

串口選擇

從開發(fā)板原理圖上,uart1接到了ch340,并配備了typc接口,本次實驗選用uart1為實驗串口。

image.png

實驗步聚

  1. 拷貝一份模版到AC7802_UART。并用vscode打開。

    image.png

  2. 在User/Src下新建Uart.c,gpio.c,在Inc目錄下新建Uart.h、gpio.h,并把Uart.c、gpio.c加入到makefile的source中

    image.png

  3. 編寫gpio.h 以及 gpio.c的Led初始化代碼:

#ifndef _GPIO_H__
#define _GPIO_H__

#include "ac780x_gpio.h"

#define LED1_PORT           (GPIOA)
#define LED1_PIN            (GPIO_PIN2)


/*LED1動作定義.*/
#define LED1_ON             do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_HIGH);}while(0)
#define LED1_OFF            do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_LOW);}while(0)
#define LED1_TOGGLE         do{if(GPIO_GetPinLevel(LED1_PORT, LED1_PIN)){LED1_OFF;}else{LED1_ON;}}while(0)


void GPIO_LedInit(void);


#endif

gpio.c

#include "gpio.h"
#include "stdbool.h"

void GPIO_LedInit(void)
{
    /*初始化引腳功能,如果引腳上電后默認為GPIO,可省略掉初始化步驟.
      有部分引腳上電默認為非GPIO,則必須選擇其功能為GPIO才能作為GPIO使用.*/
    GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);/*! 功能復用選擇.*/


    /*! 設置LED引腳為GPIO輸出.*/
    GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);


    LED1_ON;

}
  1. 編寫uart.h、usrt.c內容如下:
#ifndef __UART_H__
#define __UART_H__
#include "ac780x_uart.h"

void UART_Cfg_Init(void);

#endif

uart.c

/* ===========================================  Includes  =========================================== */
#include < stdbool.h >
#include "ac780x_gpio.h"
#include "ac780x_uart_reg.h"
#include "Uart.h"


/* ============================================  Define  ============================================ */
#define RX_BUF_LEN   100U

/* ===========================================  Typedef  ============================================ */


/* ==========================================  Variables  =========================================== */
uint8_t g_rxLen  = 0;                 /*!< 串口接收長度變量 */        
uint8_t g_txLen  = 0;                 /*!< 串口發(fā)送長度變量 */
uint8_t g_txCnt  = 0;
uint8_t g_rxBuf[RX_BUF_LEN] = {0};    /*!< 串口接收數(shù)組 */     
uint8_t g_rec_state = 0;
/* ====================================  Functions declaration  ===================================== */


/* ======================================  Functions define  ======================================== */

/*!
 * @brief   串口回調函數(shù)
 *
 * @param   void *device:UART_Type pointer
            uint32_t wpara:UART lsr0 register
            uint32_t lpara:UART lsr1 register
 * @return  none
 */
void UART_Callback(void *device, uint32_t wpara, uint32_t lpara)
{
    UART_Type *Uart_Device = (UART_Type *)device;

    /*! 串口接收中斷 */
    if(wpara & UART_LSR0_DR_Msk)
    {
        g_rxBuf[g_rxLen++] = UART_ReceiveData(Uart_Device);

        if(g_rxLen > RX_BUF_LEN)
        {
            g_rxLen = 0;
        }
    }

    /*!< 發(fā)送fifo空中斷  */
    if(Uart_Device- >IER & UART_IER_ETXE_Msk)
    {
        UART_SendData(Uart_Device,g_rxBuf[g_txCnt++]);

        if(g_txCnt >= g_txLen)
        {
            g_txCnt = 0;
            UART_SetTXEInterrupt(Uart_Device, DISABLE);
        }
    }

    /*!< 串口空閑中斷 */
    if(lpara & UART_LSR1_IDLE_Msk)
    {
        g_rec_state = 1;

        //UART_SetTXEInterrupt(Uart_Device, ENABLE);
    }
}

/*!
 * @brief   uart configuration init
 *
 * @param   none
 * @return  none
 */
void UART_Cfg_Init(void)
{
    UART_ConfigType uart_config;

    GPIO_SetFunc(GPIOA, GPIO_PIN4, GPIO_FUN3);    /*! uart tx */
    GPIO_SetFunc(GPIOA, GPIO_PIN5, GPIO_FUN3);    /*! uart rx */

    uart_config.baudrate   = 115200;              /*! 波特率115200 */
    uart_config.dataBits   = UART_WORD_LEN_8BIT;  /*! 數(shù)據(jù)8bit */
    uart_config.stopBits   = UART_STOP_1BIT;      /*! 停止位1bit */
    uart_config.fifoByteEn = DISABLE;   
    uart_config.sampleCnt  = UART_SMP_CNT0;       /*! 16倍采樣 */
    uart_config.callBack   = UART_Callback;       /*! 回調函數(shù)設置 */

    UART_Init(UART1,&uart_config);                /*! 串口初始化 */

    UART_SetRXNEInterrupt(UART1, ENABLE);         /*! 串口接收中斷使能 */

    UART_SetIdleFuncEn(UART1, ENABLE);
    UART_SetIdleInterrupt(UART1, ENABLE);         /*! 使能串口空閑中斷 */

    NVIC_SetPriority(UART1_IRQn, 3);              /*! 串口中斷優(yōu)先級 */
    NVIC_ClearPendingIRQ(UART1_IRQn);
    NVIC_EnableIRQ(UART1_IRQn);
}

編程的要點主要是串口中斷中的空閑中斷,如果觸發(fā)了空閑中斷,我們就認為接收一次命令完畢,更新接收標志為1.為主程序來判斷提供標志位。

  1. 編寫主程序如下:
/* --------------------------------- Includes -------------------------------*/
#include "main.h"
#include "ac780x_uart_reg.h"
#include "Uart.h"
#include "gpio.h"

/* --------------------------------- Function Prototypes --------------------*/
void SystemClock_Config(void);

extern uint8_t g_rxLen;                 /*!< 串口接收長度變量 */        

extern uint8_t g_rxBuf[RX_BUF_LEN];    /*!< 串口接收數(shù)組 */     
extern uint8_t g_rec_state;

/**
  * @brief  The application entry point.
  *
  * @retval int
  */
int main(void)
{

    SystemClock_Config();
    InitDelay();
    GPIO_LedInit();

    UART_Cfg_Init();
    while(1)
    {
      if(g_rec_state == 1)
      {
        g_rec_state = 0;
        if(g_rxLen >=4)
        {
          if(g_rxBuf[0] == 'L' && g_rxBuf[1] == 'E' && g_rxBuf[2] == 'D' && g_rxBuf[3] == 'O' && g_rxBuf[4] == 'N')
          {
            LED1_ON;
          }
          else if(g_rxBuf[0] == 'L' && g_rxBuf[1] == 'E' && g_rxBuf[2] == 'D' && g_rxBuf[3] == 'O' && g_rxBuf[4] == 'F'  && g_rxBuf[5] == 'F')
          {
            LED1_OFF;
          }
          g_rxLen = 0;
        }
      }
      

    }

}


/**
    * @brief System Clock Configuration
    * @retval None
    */
void SystemClock_Config(void)
{
    CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC);
    CKGEN_SetSysclkDiv(SYSCLK_DIVIDER_1);
    CKGEN_SetAPBClockDivider(APBCLK_DIVIDER_2);
}



/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void Error_Handler(char *file, int line)
{
    /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to handle the driver error */
    while(1)
    {
    }
    /* USER CODE END Error_Handler_Debug */
}

/************************ (C) COPYRIGHT AutoChips *****END OF FILE****/
  1. 編譯,然后執(zhí)行make flash:
lugl@lugl-virtual-machine:~/ac7802/AC7802_UART$ make
arm-none-eabi-gcc -c -mcpu=cortex-m0plus -mthumb    -IInc -IDrivers/ATC_Driver/Inc -IDrivers/Device/Include -IDrivers/Device -IDrivers/Device/Include/CMSIS -IUser/Inc -O0 -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MF"build/Uart.d" -Wa,-a,-ad,-alms=build/Uart.lst User/Src/Uart.c -o build/Uart.o
arm-none-eabi-gcc build/main.o build/AC7802x_irq_cb.o build/AC7802x_msp.o build/system_AC7802x.o build/ac780x_gpio.o build/ac780x_ckgen.o build/ac780x_spm.o build/ac780x_uart.o build/Uart.o build/gpio.o build/startup_AC7802x.o -mcpu=cortex-m0plus -mthumb   -specs=nano.specs -TAC78022MBQA_FLASH.ld  -lc -lm -lnosys  -Wl,-Map=build/AC7802_UART.map,--cref -Wl,--gc-sections -o build/AC7802_UART.elf
arm-none-eabi-size build/AC7802_UART.elf
   text    data     bss     dec     hex filename
  12384      12    2228   14624    3920 build/AC7802_UART.elf
arm-none-eabi-objcopy -O ihex build/AC7802_UART.elf build/AC7802_UART.hex
arm-none-eabi-objcopy -O binary -S build/AC7802_UART.elf build/AC7802_UART.bin
lugl@lugl-virtual-machine:~/ac7802/AC7802_UART$ make flash
pyocd flash ./build/AC7802_UART.elf --target ac78022mbqa
0000415 I Loading /home/lugl/ac7802/AC7802_UART/build/AC7802_UART.elf [load_cmd]
[==================================================] 100%
0001737 I Erased 4096 bytes (8 sectors), programmed 4096 bytes (8 pages), skipped 8704 bytes (17 pages) at 9.46 kB/s [loader]

實現(xiàn)效果

我們打開串口助手,發(fā)送LEDON、LEDOFF就可以控制LED燈的亮與滅了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    240

    文章

    23063

    瀏覽量

    657067
  • 編程
    +關注

    關注

    88

    文章

    3565

    瀏覽量

    93536
  • Ubuntu
    +關注

    關注

    5

    文章

    559

    瀏覽量

    29503
  • 串口控制
    +關注

    關注

    0

    文章

    25

    瀏覽量

    9847
  • 杰發(fā)科技

    關注

    0

    文章

    72

    瀏覽量

    5946
收藏 人收藏

    評論

    相關推薦

    Ubuntu VSCODE+GCC】CW32L031實現(xiàn)UART控制LED

    ubuntu系統(tǒng)下面使用vscode 使用串口驅動實現(xiàn)對板載LED控制
    的頭像 發(fā)表于 06-28 17:10 ?796次閱讀
    【<b class='flag-5'>Ubuntu</b> VSCODE+GCC】CW32L031實現(xiàn)UART<b class='flag-5'>控制</b><b class='flag-5'>LED</b>

    串口控制LED電路圖

    串口控制LED電路圖
    發(fā)表于 11-13 09:04 ?5442次閱讀

    四維圖新旗下發(fā)科技首款功能安全MCU–AC7840x提前回片

    近日,四維圖新旗下發(fā)科技首款功能安全MCU–AC7840x提前回片,并成功啟動點亮。AC7840x的到來,將全面提升汽車電子零部件的安全性,拓展國產MCU在汽車電子領域的應用,是
    的頭像 發(fā)表于 03-18 08:59 ?1585次閱讀

    使用串口控制LED亮滅

    我們知道串口通信可以讓單片機和電腦進行數(shù)據(jù)交換。那么是否可以用串口控制LED亮滅呢?當然是可以的。首先需要保證
    的頭像 發(fā)表于 10-11 11:45 ?1.3w次閱讀

    四維圖新智芯車規(guī)級MCU芯片AC7802x一次性成功點亮 實現(xiàn)“中國芯”又一突破

    近日,四維圖新智芯車規(guī)級MCU芯片AC7802x提前回片,并一次性成功點亮。AC7802x的到來,將進一步豐富四維圖新與旗下發(fā)科技在MCU芯片的布局,拓展國產MCU在汽車電子領域的應
    發(fā)表于 11-24 10:36 ?731次閱讀

    ac7840x 發(fā)

    ac7840x 發(fā) 8月3日,四維圖新官微發(fā)布消息稱,近日,子公司發(fā)科技AutoChips
    發(fā)表于 03-30 10:28 ?495次閱讀

    發(fā)科技AC7802x測評】開箱

    介紹發(fā)科技AC7802x高可靠低功耗車規(guī)級MCU
    的頭像 發(fā)表于 05-26 14:35 ?42.5w次閱讀
    【<b class='flag-5'>杰</b><b class='flag-5'>發(fā)</b>科技<b class='flag-5'>AC7802x</b>測評】開箱

    PEmicro開發(fā)與燒錄工具全面支持四維圖新旗下發(fā)科技全系列MCU

    近日,四維圖新旗下發(fā)科技和PEmicro共同宣布,PEmicro開發(fā)與燒錄工具已全面支持發(fā)科技全系列MCU芯片,包括AC781x
    的頭像 發(fā)表于 05-31 10:41 ?977次閱讀

    體驗linux發(fā)7802x開發(fā)串口不定長收發(fā)實驗

    把原來的工程復制一份到新的文件夾,并重命名為AC7802_UART工程。
    的頭像 發(fā)表于 06-04 15:37 ?21.8w次閱讀

    四維圖新旗下發(fā)科技首顆國產化車規(guī)級MCU芯片AC7802x正式量產

    網聯(lián)汽車時代為一級供應商和OEM廠商提供了高性價比的汽車電子解決方案。 AC7802x量產豐富了發(fā)科技MCU產品序列,使客戶擁有更加多元化的產品選擇,這款國產化供應鏈芯片,是公司實現(xiàn)“中國芯”的又一突破,同時也是在車規(guī)級微
    的頭像 發(fā)表于 08-03 18:35 ?691次閱讀
    四維圖新旗下<b class='flag-5'>杰</b><b class='flag-5'>發(fā)</b>科技首顆國產化車規(guī)級MCU芯片<b class='flag-5'>AC7802x</b>正式量產

    四維圖新旗下發(fā)科技國產化供應鏈車規(guī)級MCU芯片AC7802x正式量產

    高性價比的汽車電子解決方案。 AC7802x量產豐富了發(fā)科技MCU產品序列,使客戶擁有更加多元化的產品選擇,這款國產化供應鏈芯片,是公司實現(xiàn)“中國芯”的又一突破,同時也是在車規(guī)級微控制
    發(fā)表于 08-03 19:04 ?505次閱讀
    四維圖新旗下<b class='flag-5'>杰</b><b class='flag-5'>發(fā)</b>科技國產化供應鏈車規(guī)級MCU芯片<b class='flag-5'>AC7802x</b>正式量產

    車規(guī)級MCU芯片AC7802x正式量產

    AC7802x量產豐富了發(fā)科技MCU產品序列,使客戶擁有更加多元化的產品選擇,這款國產化供應鏈芯片,是公司實現(xiàn)“中國芯”的又一突破,同時也是在車規(guī)級微控制器領域的持續(xù)創(chuàng)新和技術進步。
    發(fā)表于 08-10 09:31 ?315次閱讀
    車規(guī)級MCU芯片<b class='flag-5'>AC7802x</b>正式量產

    四維圖新旗下發(fā)科技與上海智驅達成戰(zhàn)略合作

    發(fā)科技的國產化供應鏈汽車規(guī)格級正式批量生產了ac7802x mcu芯片,芯片已經引導各效仿為客戶進行了大規(guī)模應用,產品和服務質量得到了市場的認可,智能網絡汽車時代的第一次向供應商和oem企業(yè)具備高性價比的的汽車電子提供了解決方
    的頭像 發(fā)表于 08-21 10:29 ?504次閱讀

    AC7840x三電機控制應用解決方案

    發(fā)微課堂》今天開講第五課啦!發(fā)科技首款功能安全MCU芯片AC7840x已經順利量產半年,考慮到客戶端對多電機應用的強烈需求,
    的頭像 發(fā)表于 10-25 09:31 ?838次閱讀
    <b class='flag-5'>AC7840x</b>三電機<b class='flag-5'>控制</b>應用解決方案

    四維圖新智芯車規(guī)級MCU芯片AC7802x一次性成功點亮 實現(xiàn)&quot;中國芯&quot;又一突破

    近日,四維圖新智芯車規(guī)級MCU芯片AC7802x提前回片,并一次性成功點亮。AC7802x的到來,將進一步豐富四維圖新與旗下發(fā)科技在MCU芯片的布局,拓展國產MCU在汽車電子領域的應
    的頭像 發(fā)表于 04-08 03:01 ?403次閱讀
    四維圖新智芯車規(guī)級MCU芯片<b class='flag-5'>AC7802x</b>一次性成功點亮 實現(xiàn)&quot;中國芯&quot;又一突破