本帖最后由 qjp1988113 于 2020-10-20 10:01 编辑
昨天下午收到杰发科技的板子,今天早上才有时间,赶紧开箱瞧一瞧吧。
包装很简介明了,很不错。
我们去官网下载资料:
官方资料做的非常详细,国产的MCU如果能在这方面提示,估计会有更多的人用。
目前还有很多国内MCU厂家产品存在规格书参考资料不完整,有错误,感觉没那么重视似的。
给出的使用说明手册也很详细:
提供了原理图和PCB源文件:
观看原理图,这款DEMO板,设计的中规中矩吧。
特色就是不亏是针对车企的,有4路CAN。
MCU没有单独的VREF引脚,看来ADC在这精度要求不高啊。
板上的SPI FLASH W25Q16未贴,也无板载的IIC元件,
根据我的感觉。这2个还是需要的,起么能很快检验这2个功能。
ADC用作检测多路按键的电路还是很少见的。
下面我们搭建开发环境:
先安装之前下载的PACK文件:
解压下载的例子:
程序写的不错,就是封装的有点多,建议减少一层封装,本来板子就是学习的,
封装多了反而麻烦,等熟悉了,用户肯定也会自己封装的。
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开始下载:
观察现象,按K6,K7对应LED2,LED3亮灭(吐槽:绿色LED太亮,眼睛都快亮瞎了):
|