[活动专区]

【AutoChips MCU 评测报告】+AC7811开箱及测试GPIO例程

[复制链接]
387|1
手机看帖
扫描二维码
随时随地手机跟帖
qjp1988113|  楼主 | 2020-10-20 10:00 | 显示全部楼层 |阅读模式
本帖最后由 qjp1988113 于 2020-10-20 10:01 编辑

昨天下午收到杰发科技的板子,今天早上才有时间,赶紧开箱瞧一瞧吧。
P1.jpg
P2.jpg
P3.jpg
P4.jpg
包装很简介明了,很不错。
我们去官网下载资料:
Autochip官方网站.png
官方资料做的非常详细,国产的MCU如果能在这方面提示,估计会有更多的人用。
目前还有很多国内MCU厂家产品存在规格书参考资料不完整,有错误,感觉没那么重视似的。
Autochip资料下载.png
资料下载2.png
下载3.png
XZ4.png
给出的使用说明手册也很详细:

介绍.png
功能说明.png
开发环境.png
提供了原理图和PCB源文件:
pcb工程文件.png
观看原理图,这款DEMO板,设计的中规中矩吧。
特色就是不亏是针对车企的,有4路CAN。
MCU没有单独的VREF引脚,看来ADC在这精度要求不高啊。
板上的SPI FLASH W25Q16未贴,也无板载的IIC元件,
根据我的感觉。这2个还是需要的,起么能很快检验这2个功能。
ADC用作检测多路按键的电路还是很少见的。
PDF1.png
PDF2.png
PDF3.png
下面我们搭建开发环境:
先安装之前下载的PACK文件:

PACK.png
PACKO.png

解压下载的例子:
程序.png
例子配套说明.png

PACK安装.png

中文注释.png
程序写的不错,就是封装的有点多,建议减少一层封装,本来板子就是学习的,
封装多了反而麻烦,等熟悉了,用户肯定也会自己封装的。
int main(void)
{
        InitDelay();
        InitDebug();
        
        #if (GPIO_SAMPLE_SEL == GPIO_BASIC_SAMPLE)
        GPIO_Basic_Sample();
        
        #elif (GPIO_SAMPLE_SEL == GPIO_MUX_SAMPLE)
        GPIO_Mux_Sample();
        
        #elif (GPIO_SAMPLE_SEL == GPIO_EXTI_SAMPLE)
        GPIO_Exti_Sample();
        
        #elif (GPIO_SAMPLE_SEL == GPIO_EXTI_WKUP_SAMPLE)
        GPIO_Exti_Wkup_Sample();
        
        #elif (GPIO_SAMPLE_SEL == GPIO_NMI_WKUP_SAMPLE)
        GPIO_Nmi_Wkup_Sample();
        
        #endif
}

void InitDelay(void)
{
    s_facus = __SYSTEM_CLOCK / 1000000;
    s_facms = s_facus * 1000;
}

void InitDebug(void)
{
#ifdef ITM_DEBUG_OUT
#else

    GPIO_SetFunc(49, 1);
    GPIO_SetFunc(50, 1);
    CKGEN_Enable(DEBUG_UART_CLK, 1);
    CKGEN_SoftReset(DEBUG_UART_SRST, 1);

    UART_SetDivisor(DEBUG_UART, APB_BUS_FREQ / 16.0 / 115200); //apbbus: 48M

    UART_SetDataBits(DEBUG_UART, 8);
    UART_SetStopBit(DEBUG_UART, 1);
    UART_EnableTX(DEBUG_UART, 1);
    UART_EnableRX(DEBUG_UART, 1);
    UART_Set2ByteFIFO(DEBUG_UART, 1);

    UART_SetIntEn(DEBUG_UART, 9);
#endif

    s_debugInit = 1;
}

void GPIO_Basic_Sample(void)
{
        GPIO_InitHardwr();
        TIMER_InitHardwr();
        
        while(1)
        {
                GPIO_ScanKeyAction();
        }
}

void GPIO_InitHardwr(void)
{
        GPIO_SetDir(LED2_PIN, GPIO_OUTPUT);//设置LED引脚为输出
        GPIO_SetDir(LED3_PIN, GPIO_OUTPUT);
        
        GPIO_SetDir(K6_PIN, GPIO_INPUT);//设置按键引脚为输入
        GPIO_SetDir(K7_PIN, GPIO_INPUT);
        
        LED2_ON;//上电默认都点亮
        LED3_ON;
}

void GPIO_ScanKeyAction(void)
{
        if (g_scanKeyTimeCnt > 9)//每10ms扫描一次按键
        {
                g_scanKeyTimeCnt = 0;//清理计时,便于下一个周期计时
               
                /*这里之所以需要记住按键状态,目的是准确识别用按键动作,避免按键一次,执行动作多次*/
                if ((g_getK6CurtSts == KEY_UNDOWN) && (K6_IN == 0))//K6按键按下,只有按键按下然后松开,才能进行下一次按键动作
                {
                        mdelay(20);//延时,消除抖动
                        if (K6_IN == 0)//消除抖动之后,如果还是按下状态,确认按键按下
                        {
                                LED2_TOGGLE;//翻转LED2
                                
                                g_getK6CurtSts = KEY_DOWN;//记住按键按下状态
                        }
                }
                else if (K6_IN == 1)//读取到高电平,按键松开
                {
                        g_getK6CurtSts = KEY_UNDOWN;//记住按键弹起状态
                }
               
                if ((g_getK7CurtSts == KEY_UNDOWN) && (K7_IN == 0))//K7按键按下,只有按键按下然后松开,才能进行下一次按键动作
                {
                        mdelay(20);//延时,消除抖动
                        if (K7_IN == 0)//消除抖动之后,如果还是按下状态,确认按键按下
                        {
                                LED3_TOGGLE;//翻转LED3
                                
                                g_getK7CurtSts = KEY_DOWN;//记住按键按下状态
                        }
                }
                else if (K7_IN == 1)//读取到高电平,按键松开
                {
                        g_getK7CurtSts = KEY_UNDOWN;//记住按键弹起状态
                }
        }
}

void TIMER_InitHardwr(void)
{
        TIMER_ConfigType timerConfig = {0};
        
        timerConfig.loadValue = (48000000 / (1000 - 1));//定时器时钟只能是外设总线时钟
        timerConfig.linkMode = 0;//不使用多定时器进行链接
        timerConfig.interruptEn = 1;//使能中断
        timerConfig.timerEn = 1;//使能定时器
        
        TIMER_SetCallback(TIMER2,TIM2_IRQnCallBack);//设置中断回调函数
        TIMER_Init(TIMER2,&timerConfig);
}

/**
* @prototype TIM2_IRQnCallBack(uint8_t lparam)
*
* @param[in] ...
* @return         ...
*
* @brief           TIM2 module interrupt handler.
*                         TIM2中断处理函数.
*/
void TIM2_IRQnCallBack(uint8_t lparam)
{
        if (TIMER_GetIntFlag(TIMER2))
    {
        TIMER_ClrIntFlag(TIMER2);
               
                if (g_scanKeyTimeCnt < 0xFF)
                {
                        g_scanKeyTimeCnt++;
                }
        }
}

程序的组织架构,并不是很好,什么都写一起了,有点混乱,没有层次和上下组织结构的体验,建议按外设分类写:gpio就写GPIO相关的,
timer就是TIMER相关的。
一个简单的定时器扫描按键状态,按键又控制LED的程序被写的这么复杂。
编译,接上JLINK开始下载:

Jlink.png
Jlik2.png
观察现象,按K6,K7对应LED2,LED3亮灭(吐槽:绿色LED太亮,眼睛都快亮瞎了):
66 (1).gif


使用特权

评论回复

相关帖子

电子学长| | 2020-10-22 10:42 | 显示全部楼层
很详细了!!谢谢楼主分享!

使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝