[活动专区]

【AC7811开发板试用活动】点灯、UART_ECHO、CAN_ECHO、uCGUI、uCOSII

[复制链接]
2582|42
手机看帖
扫描二维码
随时随地手机跟帖
lihuasoft|  楼主 | 2019-10-23 20:35 | 显示全部楼层 |阅读模式
本帖最后由 lihuasoft 于 2019-10-23 20:35 编辑

说一下最先的直观感受:杰发MCU的库函数简洁明了,Demo例程简洁明了,杰发官网的风格也是简洁明了。
让人感觉亲切友好。
用MDK打开了几个官方例程,编译速度超快!
下载到芯片里运行......就这样,我在山东的一个小县城,感受着中国“芯”的脉动。

看杰发的代码,可以学到一些写程序的方法、思路。
而且,国产芯片还是很有前途的,所以,搞技术的伙伴们,多学一种MCU不是坏事,机会总是留给有准备的人。

感谢恒迈的向向,没有她的热情推介,我可能关注不到这款优秀的国产MCU。
还感谢21ic论坛,提供了这么好的交流空间。

有两个建议:
一是建议官方开发Simulink自动代码生成库。象TI、ST这样的厂家,已经在这样做了。好处就是,可以直接把MATLAB/Simulink现有的算法库拿来使用,基于模型设计应用程序,直接生成全部c代码。
二是建议与CODESYS官方合作,可以扩大在工业设备、工程车辆等领域的影响。前期可以设计一款通用开发板支持CODESYS(树莓派就是这样做的)。

以下几层楼,是我体验这款MCU的过程记录,让伙伴们见笑了:


1、点灯(寄存器写入一组IO)

2、UART-ECHO实验

3、CAN收发实验

4、移植uCGUI+uCOSII

5、FreeRTOS移植

AC781x的定时器架构和STM32不太一样,打算在电机驱动实验时再了解。






使用特权

评论回复

相关帖子

lihuasoft|  楼主 | 2019-10-23 20:37 | 显示全部楼层
本帖最后由 lihuasoft 于 2019-10-23 20:49 编辑

1、点灯(寄存器写入一组IO)

作为一名“点灯工程师”,点亮LED是我的最爱。
mini板自带了一个blink-demo,那我就把它改成点亮多个LED的吧:

int main(void)
{
    InitDebug();
    InitDelay();
        
    //PA0是mini板的user-LED,PA8-PA15控制8个LED
    GPIO_SetFuncGroup(GPIOA, GPIOx_Pin_All, 0);
    GPIO_SetDirGroup(GPIOA, GPIOx_Pin_All, 1);
    while (1)
    {
        //注意,虽然名为.Byte,却是uint32_t的宽度,我们只用低16位
        GPIOA->GPIO_ODR.Byte = 0x00005501;
        mdelay(500);
        GPIOA->GPIO_ODR.Byte = 0x0000AA00;
        mdelay(500);
    }
}


上电后,8+1个LED交替闪烁。
附整个工程文件。

1-led.jpg

点灯.zip (643.47 KB)

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-23 20:39 | 显示全部楼层
本帖最后由 lihuasoft 于 2019-10-23 20:49 编辑

2、UART-ECHO实验

把官方UART通信例子,改成了一个UART-ECHO实例。
使用UART2,TX/RX引脚对应PD1/PD2,两个LED对应PA0/PA1。
运行后,每收到上位机发来一个字符,就把这个字符原样发回。
全部代码请下载附件,下面是中断服务函数部分:

int32_t UART_IRQHandler(uint8_t port, uint32_t LSR0, uint32_t LSR1)
{
    UART_Type *UARTx = UART_CTRL_MAP[port - 1];

    /*rx interrupt*/
    if (UARTx->UARTn_IER.ERXNE == 1 && (LSR0 & LSR0_DR))
    {
        txBuf[0] = UARTx->UARTn_RBR_THR;
        if (txBuf[0]==49)//收到'1'则开启Timer
        {
                TIMER_Enable(TIMER1);
        }
        else
        {
                UART_SetTxIntEn(UARTx, 1);//注意,每次发送之前开启TX中断
                UART_SendData(UARTx, txBuf[0]);
        }
        return 1;
    }

    /*tx interrupt*/
    if (UARTx->UARTn_IER.ETXE == 1 && (LSR0 & LSR0_THRE))
    {
        LED0 = !LED0;
        UARTx->UARTn_IER.ETXE = 0;
    }

    return 0;
}


2-uart1.jpg 2-uart2.PNG

UART_ECHO.zip (747.84 KB)

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-23 20:42 | 显示全部楼层
本帖最后由 lihuasoft 于 2019-10-23 20:50 编辑

3、CAN收发实验

作为车规级、目标定位在后装市场的MCU,CAN和LIN必不可少。
官方CAN例子,以及论坛版主早先发布的一个CAN实例,代码量都挺多的。
那么我就简化一下,免得像我一样喜欢简单的伙伴望而生畏。
首先,在板子上贴一个收发器芯片(我用的是TJA1050):
3-can-1.jpg 3-can-2.jpg
然后新建工程,参考官方和版主的代码,简化一下。波特率1MHz,CAN1。
mini板的收发器的standby引脚接在PB2上。
附件里有两个版本,一个是在main()循环里发报文,另一个是在接收中断里发报文。
贴出循环里发报文的:

#include "ac78xx.h"
#include "ac78xx_gpio.h"
#include "ac78xx_can.h"

#define PAout(n)   BIT_ADDR(GPIOA_ODR_ADDR, n)
#define PAin(n)    BIT_ADDR(GPIOA_IDR_ADDR, n)
#define PBout(n)   BIT_ADDR(GPIOB_ODR_ADDR, n)
#define PBin(n)    BIT_ADDR(GPIOB_IDR_ADDR, n)

#define LED0                                PAout(0)
#define LED1                                PAout(1)

#define PIN_LED0                (GPIO_PA0)
#define PIN_LED1                (GPIO_PA1)

#define CAN1_TX                        (GPIO_PC15)
#define CAN1_RX                        (GPIO_PC14)
#define CAN1_STB                (GPIO_PB2)

#define CAN1_TRASCVER_NML                        do{GPIO_ResetPinBits(CAN1_STB);}while(0)


CAN_MSG_INFO sMsg = {0};
uint8_t receved = 0;


int32_t CanEventCallback(uint32_t event, uint32_t wparam, uint32_t lparam)
{
    if (event & (uint32_t)CAN_EVENT_BUSERROR)
    {
        //printf("[CAN]ERROR: %x %x %x\r\n", event, wparam, lparam);
                                LED1=1;
    }

    if (event & (uint32_t)CAN_EVENT_RECVMSG)
    {
                                        //lparam==CAN1 or CAN2
                                        if (!CAN_MessageRead((CAN_Type*)lparam, &sMsg))
                                        {
                                                        receved = 1;
                                                        LED0 = !LED0;
                                        }
    }
               
    return 0;
}

int main(void)
{
        CAN_Config canConfig = {0};
        CAN_FilterControl filter = {0};
        
        GPIO_SetFunc(CAN1_TX, 1);//设置CAN1引脚复用功能
        GPIO_SetFunc(CAN1_RX, 1);
        GPIO_SetDir(CAN1_STB, 1);//设置CAN1收发器控制为IO控制
        CAN1_TRASCVER_NML;//使能CAN收发器
               
        filter.index = 1;
        filter.code = 0x00000501;
        filter.mask = 0x1fffffff;
        filter.enable = 1;
        
        canConfig.interruptEnable = 1;//使能中断
        canConfig.TSSS = 1;//使用次发送缓冲区发送
        canConfig.canMode = CAN_MODE_NORMAL;
        canConfig.autoReset = 1;//CAN BUSOFF后,自动恢复
        canConfig.filterList = &filter;//过滤器
        
        CAN_SetEventCallBack(CAN1, CanEventCallback);
        CAN_Initialize(CAN1, &canConfig, GetCommonBaudrate(CAN_BAUDRATE_1M));
               
        GPIO_SetDir((uint32_t)PIN_LED0, 1);
        GPIO_SetDir((uint32_t)PIN_LED1, 1);
        LED0 = 0; LED1 = 0;
               
    while (1)
    {
                                if(receved)
                                {
                                                if (!CAN_IsTransmitBusy(CAN1, TRANSMIT_SECONDARY))
                                                {
                                                                sMsg.ID++;
                                                                CAN_MessageSend(CAN1, &sMsg, TRANSMIT_SECONDARY);
                                                                receved = 0;
                                                }
                                }
    }
}



用上位机每5ms发送一个报文,AC7811收到后ID加1再发出来,以下是效果:
3-can-4.PNG 3-can-3.jpg

CAN_ECHO.zip (1013.12 KB)

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-23 20:44 | 显示全部楼层
4、移植ucGUI和ucOSII
软硬件概况:
ucGUI v3.98(控件不如新版本的emWin多)
ucOSII
320x240彩屏(驱动芯片ILI9341,不带触摸)
AC7811,无FSMC总线接口,采用纯IO驱动裸屏
用1个IO作为物理按键发ucGUI消息

显示部分的接口配置:
  TFT的数据线D0-D7接PB0-PB7
  TFT的其它控制线:
    RD = PA2
    WR = PA3
    CS = PA4
    RS = PA5
    BL = PA6
    RST= PA7
这个屏不带触摸,于是用一个IO做物理按键,实现了ucGUI响应按键消息的效果(例子中实现的效果是背光处理)。

4-gui-1.jpg 4-gui-2.jpg 4-gui-3.jpg

AC7811_uCGUI_uCOSII_ILI9341_IO.zip (1.36 MB)

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-23 20:47 | 显示全部楼层
5、FreeRTOS移植

其实拿到板子点了灯之后,最先体验的就是移植了一个FreeRTOS操作系统。
然而后来在论坛浏览,发现版主早就发布了FreeRTOS移植的贴子。
那么就把我的移植步骤记在这里吧,其实都差不多的样子,很简单的操作。

CortexM3芯片在MDK移植FreeRTOS步骤
(lihuasoft整理于2019-10-15)

其实很简单。先新建一个MDK工程,然后下载FreeRTOS的官方压缩包。


1、把里面的Source文件夹解压到KeilMDK工程文件夹中去,更名为RTOS
   其下面include和portable文件夹也要一起解压过去。


2、把RTOS\portable文件夹中除MemMang、RVDS这两个之外的全删掉


3、从原FreeRTOS\Demo下找一个FreeRTOSConfig.h文件拷到RTOS\portable下
   也可以直接使用附件工程里FreeRTOSConfig.h
   注意,这个头文件里,需要根据硬件做一些配置,而且添加了以下3个宏,
        #define vPortSVCHandler SVC_Handler
        #define xPortPendSVHandler PendSV_Handler
        #define xPortSysTickHandler SysTick_Handler


4、用MDK5打开标准库工程,并打开三色积木图标的工程项目管理窗口
   添加名为RTOS的分组,并在里面添加以下文件:
        RTOS\list.c
        RTOS\queue.c
        RTOS\tasks.c
        RTOS\portable\RVDS\ARM_CM3\port.c
        RTOS\portable\MemMang\heap_2.c


5、在MDK的Options for Target窗口的C/C++页,添加Include paths:
        RTOS\include
        RTOS\portable
        RTOS\portable\RVDS\ARM_CM3


6、main.c中,引用以下3个头文件
        #include "FreeRTOS.h"  
        #include "task.h"  
        #include "queue.h"  


7、在main.c中,定义形如以下的任务函数:
void vLEDTask1( void *pvParameters )
{
  for( ;; )
  {
    LED2 = !LED2;
    vTaskDelay( 500/portTICK_RATE_MS );
  }
}
void vLEDTask2( void *pvParameters )
{
  for( ;; )
  {
    LED3 = !LED3;
    vTaskDelay( 200/portTICK_RATE_MS );
  }
}


8、在main()中,硬件初始化完毕后,创建任务,并启用调度器,把控制权交给OS:
int main(void)
{
        LED_Init();
        
  xTaskCreate(vLEDTask1, (const portCHAR *) "LED1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+4, NULL);
        xTaskCreate(vLEDTask2, (const portCHAR *) "LED2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+5, NULL);
        
  vTaskStartScheduler();
        
        return(0);
}

9、如果是STM32,还要从stm32f103x_it.c中,找到以下3个中断函数的空函数,注释掉:
        SVC_Handler、PendSV_Handler、SysTick_Handler

FreeRTOS_Demo.zip (266.17 KB)

使用特权

评论回复
TechHolder| | 2019-10-24 09:17 | 显示全部楼层
lihuasoft 发表于 2019-10-23 20:44
4、移植ucGUI和ucOSII
软硬件概况:
ucGUI v3.98(控件不如新版本的emWin多)

漂亮,屏是多大的?刷新感觉会卡吗?

使用特权

评论回复
TechHolder| | 2019-10-24 09:19 | 显示全部楼层
lihuasoft 发表于 2019-10-23 20:47
5、FreeRTOS移植

其实拿到板子点了灯之后,最先体验的就是移植了一个FreeRTOS操作系统。

厉害。

使用特权

评论回复
JasonLee27| | 2019-10-24 10:14 | 显示全部楼层
lihuasoft 发表于 2019-10-23 20:44
4、移植ucGUI和ucOSII
软硬件概况:
ucGUI v3.98(控件不如新版本的emWin多)

这个厉害

使用特权

评论回复
AutochipsMCU| | 2019-10-24 10:25 | 显示全部楼层
感谢建议,您的建议我已拿小本本记下。

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-24 16:34 | 显示全部楼层
HMWY1805 发表于 2019-10-24 09:14
大清早看到李老师的深度测评,飞一般的感觉,感谢关注、支持杰发,沙发也抢到了! ...

谢谢向经理鼓励

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-24 16:38 | 显示全部楼层
TechHolder 发表于 2019-10-24 09:17
漂亮,屏是多大的?刷新感觉会卡吗?

屏尺寸比较小,大约有3寸?在家里,记不太清了。分辨率是320x240,感觉刷起来速度还行,尽管是纯IO驱动,但不弱于同为M3的STM32F103(FSMC驱动)。我感觉AC781x很多性能要比STM32F103强(当然,许多外设尚待体验)。谢谢大佬关注

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-24 16:39 | 显示全部楼层

版主大佬过奖了。本人感觉向官方工程师可以学到很多。

使用特权

评论回复
TechHolder| | 2019-10-24 17:28 | 显示全部楼层
lihuasoft 发表于 2019-10-24 16:38
屏尺寸比较小,大约有3寸?在家里,记不太清了。分辨率是320x240,感觉刷起来速度还行,尽管是纯IO驱动, ...

这样说来,AC781X刷新3寸屏还OK,主要还是要看刷写整屏效果。

使用特权

评论回复
JasonLee27| | 2019-10-24 17:37 | 显示全部楼层
lihuasoft 发表于 2019-10-24 16:39
版主大佬过奖了。本人感觉向官方工程师可以学到很多。

每个人都有自己的局限性,还是要相互学习的

使用特权

评论回复
szjlj168| | 2019-10-24 18:51 | 显示全部楼层
厉害了,我是来学习的

使用特权

评论回复
ATC2019| | 2019-10-25 08:50 | 显示全部楼层
这个是大师,厉害厉害

使用特权

评论回复
marginer| | 2019-10-28 11:39 | 显示全部楼层
可以在活动二那个贴子下面留言,参加评选活动。

使用特权

评论回复
lihuasoft|  楼主 | 2019-10-29 16:06 | 显示全部楼层
marginer 发表于 2019-10-28 11:39
可以在活动二那个贴子下面留言,参加评选活动。

谢谢您,已在活动二跟贴回复此贴网址。本周打算再写点有营养有用处的应用,为丰富杰发MCU生态做点贡献。

使用特权

评论回复
戊戌变法| | 2019-11-6 15:42 | 显示全部楼层
CAN滤波器 需要 是 1  
filter.index = 1;  
不知道有没有试过 用0  我测试用0 就失败 其他都能正常运行滤波器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

268

帖子

3

粉丝