打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】+MCC配置函数及一个优化故障

[复制链接]
787|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qjp1988113 于 2020-8-6 11:48 编辑

IDE 开发环境配置好了,下面就开始用MCC,配置生成一些建议的代码吧。貌似好像现在各大厂商
都流行这种配置工具了,搞的时间久了,底层都不知道在哪了。
新建一个工程,打开MCC,如下图配置:

或者


配置引脚功能直接在芯片模型上选择对应引脚,右键选择即可:

设置好后,会自动生成如下界面,这里你也可以修改下参数,加下
自己的标签等。

添加外设模块,可以在2个地方添加:


添加后,会跳到新生成外设的配置界面。
具体如下:





配置好后:点击左边的生成:

在打开工程,文件就全有了。

代码生成后,我们只要把自己的代码添加进去就行了。
设定的场景为:定时器为1s中断一次,其中LED在中断中翻转状态。同时添加一个变量
基于1S的定时器,做一个1S的延时函数。主函数中,每隔5S打印一次“Hello world!”
在生成的定时器函数 tca0.c和tca0.h里面修改:
在tca0.c找到中断的回调函数,直接修改:
volatile uint32_t Send**=0;
void TCA0_DefaultOVFIsrCallback(void)
{
    //Add your ISR code here
    LED_Toggle();


    if(Send**>0)
    {
        Send**--;
        //printf("the Send** now is %d!\r\n",Send**);
    }   
}

在tca0.h添加变量的外部调用:extern volatile uint32_t Send**;
LED_Toggle()的具体定义就在pin_manager.h,就是控制LED引脚
PC6状态取反:
#define LED_Toggle() do { PORTC_OUTTGL = 0x40; } while(0)
在main.c 里面添加自定义的延时函数:
void delays(uint32_t s)
{
    uint32_t old**=0;
    uint32_t New**=0;

    Send**=s;
    while(Send**)
    {
        /*
        old**=New**;
        New**=Send**;
        if(old**!=New**)
        {

            printf("the Send** now is %d!\r\n",Send**);
        }  
        */  
    }
    //printf("the senprintfd** now is break!\r\n");
}

int main(void)
{
    /* Initializes MCU, drivers and middleware */
    SYSTEM_Initialize();

    printf("Hello world!\r\n");

    //Send**=20;
    /* Replace with your application code */
    while (1){
        /*
        if(Send**>0)
        {
            printf("the send** now is %d!\r\n",Send**);
            _delay_ms(500);
        }*/
        printf("Hello world!\r\n");
        delays(5);
        //_delay_ms(500)
    }
}

编译下载:
LED 1s交替闪烁  串口5S一次输出“Hello world!”.

是不是看起来很简单。
其中出现了一次坑,就是编译器优化所致。我对变量volatile uint32_t Send**,一开始未加“volatile
修饰字,结果串口每次输出一边就死循环在延时函数里面了。

使用特权

评论回复
沙发
奔波儿熊| | 2020-8-6 14:55 | 只看该作者
肯定的, 中断里用到的外部变量要加volatile

使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝