This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C123GH6PM:需要有关创建和调用用户定义函数的帮助

Guru**** 2587345 points
Other Parts Discussed in Thread: EK-TM4C123GXL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/604368/ccs-tm4c123gh6pm-need-help-creating-and-calling-user-defined-functions

部件号:TM4C123GH6PM
主题中讨论的其他部件:EK-TM4C123GXL

工具/软件:Code Composer Studio

您好,

我可以在以下问题上使用一些帮助。

开发环境:

IDE:CCS版本:7.1 .0.0.0016万 ,运行在带SP1的Windows 7专业版上,包括所有当前更新。

驱动程序库:StellarisRegistered外设驱动程序库:软件驱动程序模型API

目标:Launchpad EK-TM4C123GXL (TM4C123GPMI板载处理器

我在CCSv7属性> CCS常规>设备字段中找不到列出的“i”版本,我选择了TM4C123GPM。 它工作正常,我的代码按预期构建,加载和运行。

我已配置CCSv7,并且能够编写C代码以成功使用PWM和GPIO外设。

但是,我无法创建和调用用户定义的函数。  我在使用uVision MDK-Lite时就能轻松做到这一点。

我搜索了TI的文档和e2e论坛以获得有关这些问题的指导,但未成功,并且尝试了许多“实验”,这些实验与我在uVision中使用的实验相似。  

我的问题:

1)     如何使用CCSv7软件驱动程序模型API在C语言中创建用户定义的函数?

2)     如何在C中调用使用CCSv7软件驱动程序模型API创建的用户定义函数?

3)     一些非常简单的示例代码与答案一起使用将非常有帮助。

    • 例如:显示如何创建和调用函数以打开和关闭用于驱动LED的启用GPIO端口的示例代码。
    • 我了解如何使用GPIO和PWM API函数。

谢谢,Bob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否向我们展示一个不起作用的示例? 我可以看到的用户功能没有问题:

    这应该可以正常工作:

    void myFunc();
    
    main()
    {
    myFunc();
    }
    
    void myFunc()
    {//
    我太懒了,无法查找实际函数
    MAP_GPIO呼叫切换器IO (Port, PIN);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Keith:
    我刚从一天的旅行中回家。 我明天会尝试一下,让您知道如何进行;我可能还有更多问题!
    Bob,感谢您的迅速回复
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Keith:

    当我在main()中添加函数代码时,我收到错误。  当然,程序不会编译和运行。

    当我注释我的函数代码原型,调用和声明时(如下面插入的项目所示),它将编译并运行。

    我找不到我的错误,希望您能找到。

    下面的代码是我的完整代码的简化版本,但当包含用户定义的函数片段时,它会导致与完整项目代码相同的错误。

    /*项目名称:函数定义和调用测试-1
    *
    写入人:Bob Samuel
    *日期:2017年6月23日
    *
    */
    
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/HW_memmap.h"
    #include "inc/hw_types.glib/gpio
    #debug/verdlib.lib"#include "driverscool/syh"
    
    #lib"driveh/map/dbl"
    
    
    
    
    
    
    
    /*----------- 用户定义的函数原型--------------------------- *//void
    
    LED_Blink ();//此功能使板载RGB LED闪烁
    
    
    /*----------- SysCtlDelay数学(SYSCLK)--------------- */
    //以秒为单位延迟的子例程
    //SYSCLK设置为20MHz = 1/MHz = 2000万 = 0.0.0005万 秒(50ns)= 3个时钟周期* 50ns =每个时钟周期150ns
    //1秒= 100万 ,000ns / 150ns =~ 666.6667万时钟周期:.5秒= 6666.6667万/2=3333333333:33.33333333亿:0.25秒= 333.3333万/2 = 1666667:.125秒= 16666667/2 = 83.3334万
    
    
    未
    签名长时钟周期1=83333334;//时钟周期数-1 (SysDelay)=无符号长时钟周期2=83.3334万 	//时钟周期数-2 (SysClertDelay)
    
    
    int main()
    {
    /*----------- 设置系统时钟(SYSCLK)--------------- */
    
    SysctlClockSet( sysctl_SYSDIV_10 | sysctl_OSC主| sysctl_XTAL_16MHz );// SYSCLK设置为20 MHz (称为“ticks”)
    
    /*----------- 启用外围设备端口:GPIOF --------------------------- */
    
    SysctlPeripheralEnable( sysctl_Periph_GPIOF );//启用GPIO:端口F
    while (!SysPeripheralReady(sysctl_Periph_GPIOF));//此函数确定是否已准备好访问特定外围设备。
    
    	//将GPIO引脚设置为输出
    
    GPIOPinTypeGPIOOutput (GPIO _PORTF_BASE,GPIO PIN_1 | GPIO PIN_2 | GPIO PIN_3);
    	
    /*----------- 用户定义的函数调用--------------------------- */*
    
    {
    	void LED_Bllink();//函数调用
    }
    
    */
    /*----------- 用户定义的函数声明--------------------------- *//void
    
    LED_Blink ()//函数声明
    
    /*----------- 闪烁板载RGB LED的代码--------------------------- */
    	{
    INT A;
    
    	对于(a=0;a<2;a=a+1)
    
    	{
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,GPIO PIN_1);//板载三色LED -红色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,0);
    SystlDelay (Delay2);
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,GPIO PIN_2);//板载三色LED -蓝色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,0);
    SystlDelay (Delay2);
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,GPIO PIN_3);//板载三色LED -绿色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,0);
    SysCtlDelay (Delay2);
    	}
    
    	}
    
    返回(0);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我在main()中添加我的函数代码时,我收到错误。

    我发现代码有任何明显的问题。 当您遇到编译错误时,是否可以从CCS控制台发布完整的输出?

    I找不到CCSv7 Properties > CCS General > Device字段中列出的“i”版本,我选择了TM4C123GPM。[/QUOT] TM4C123GPMI器件型号中的最后“i”字符表示器件的温带范围是 –40°C到+85°C

    CCS设备名称不包括零件号的温带范围成分,因此您在CCS中选择了正确的设备。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chester,

     

    感谢您提供有关温度命名的信息。 我在数据表上肯定没有看到它。

     

    我已在下面插入控制台和问题输出和代码。 该代码是一个大型项目的简化版本,但在定义和调用函数时,结果是相同的。

     

    此外,如果您有任何可改进我的代码的其他建议,请随时提出。

     

    感谢你的帮助。

     

    Bob


    /*项目名称:函数定义和调用测试-1 * 写入人:Bob Samuel *日期:2017年6月23日 * */ #include <stdint.h> #include <stdbool.h> #include "inc/HW_memmap.h" #include "inc/hw_types.glib/gpio #debug/verdlib.lib"#include "driverscool/syh" #lib"driveh/map/dbl" /*----------- 用户定义的函数--------------------------- */ void LED_Blink ();//此功能使板载RGB LED闪烁 /*----------- SysCtlDelay数学(SYSCLK)--------------- */ //以秒为单位延迟的子例程 //SYSCLK设置为20MHz = 1/MHz = 2000万 = 0.0.0005万 秒(50ns)= 3个时钟周期* 50ns =每个时钟周期150ns //1秒= 100万 ,000ns / 150ns =~ 666.6667万时钟周期:.5秒= 6666.6667万/2=3333333333:33.33333333亿:0.25秒= 333.3333万/2 = 1666667:.125秒= 16666667/2 = 83.3334万 未 签名长时钟周期1=83333334;//时钟周期数-1 (SysDelay)=无符号长时钟周期2=83.3334万 //时钟周期数-2 (SysClertDelay) int main() { /*----------- 设置系统时钟(SYSCLK)--------------- */ SysctlClockSet( sysctl_SYSDIV_10 | sysctl_OSC主| sysctl_XTAL_16MHz );// SYSCLK设置为20 MHz (称为“ticks”) /*----------- 启用外围设备端口:GPIOF --------------------------- */ SysctlPeripheralEnable( sysctl_Periph_GPIOF );//启用GPIO:端口F while (!SysPeripheralReady(sysctl_Periph_GPIOF));//此函数确定是否已准备好访问特定外围设备。 //将GPIO引脚设置为输出 GPIOPinTypeGPIOOutput (GPIO _PORTF_BASE,GPIO PIN_1 | GPIO PIN_2 | GPIO PIN_3); /*----------- 用户定义的函数调用--------------------------- */ { void LED_Bllink();//函数调用 } /*----------- 用户定义的函数声明--------------------------- */ void LED_Blink ()//函数声明 /*----------- 闪烁板载RGB LED的代码--------------------------- */ { INT A; 对于(a=0;a<2;a=a+1) { GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,GPIO PIN_1);//板载三色LED -红色 SysCtlDelay (Delay1); GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,0); SystlDelay (Delay2); GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,GPIO PIN_2);//板载三色LED -蓝色 SysCtlDelay (Delay1); GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,0); SystlDelay (Delay2); GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,GPIO PIN_3);//板载三色LED -绿色 SysCtlDelay (Delay1); GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,0); SysCtlDelay (Delay2); } } 返回(0); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I have inserted the Console and problems output and code below

    LED_Blink function definition is nested inside inside inmain function which is not valid ANSI C.(我已插入控制台并在下面输入问题和代码[/报价]LE

    LED_Blink函数的定义应移至主函数之外。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chester,

    好消息和坏消息!

    好的:我做了你描述的更改,代码编译了;没有错误,代码构建了。

    错误:目标未加载和/或代码。

    以下是控制台和调试窗口捕获;它们随每次连续单击绿色恢复按钮而变化,如下所示。

    请注意,“调试”窗口的信息会发生变化。 似乎还设置了一个断点。

    此外,我在这篇文章末尾还附上了一份经过修改的代码副本。

    非常感谢您的帮助。

    再次感谢Bob  

    1.单击绿色恢复按钮之前:

    2.首次单击 绿色恢复按钮后:

    3.第二次单击 绿色恢复按钮后:

    4.新修改的代码:

    /*项目名称:函数定义和调用测试-1
    *
    写入人:Bob Samuel
    *日期:2017年6月23日
    *
    */
    
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/HW_memmap.h"
    #include "inc/hw_types.glib/gpio
    #debug/verdlib.lib"#include "driverscool/syh"
    
    #lib"driveh/map/dbl"
    
    
    
    
    
    
    
    /*----------- 用户定义的函数原型--------------------------- */
    
    	void LED_Blink ();//此功能使板载RGB LED闪烁
    
    
    /*----------- SysCtlDelay数学(SYSCLK)--------------- */
    //以秒为单位延迟的子例程
    //SYSCLK设置为20MHz = 1/MHz = 2000万 = 0.0.0005万 秒(50ns)= 3个时钟周期* 50ns =每个时钟周期150ns
    //1秒= 100万 ,000ns / 150ns =~ 666.6667万时钟周期:.5秒= 6666.6667万/2=3333333333:33.33333333亿:0.25秒= 333.3333万/2 = 1666667:.125秒= 16666667/2 = 83.3334万
    
    未
    签名长时钟周期1=83333334;//时钟周期数-1 (SysDelay)=无符号长时钟周期2=83.3334万 	//时钟周期数-2 (SysCtlDelay)
    
    
    /*--------------- 用户定义的函数声明--------------------------- */
    
    	void LED_Blink ()//函数声明
    
    /*--------------- 闪烁板载RGB LED的代码--------------------------- */
    {
    int a;
    
    	for (a=0;a<1;a=a+1)
    
    	{
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,GPIO PIN_1);//板载三色LED -红色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,0);
    SystlDelay (Delay2);
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,GPIO PIN_2);//板载三色LED -蓝色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,0);
    SystlDelay (Delay2);
    
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,GPIO PIN_3);//板载三色LED -绿色
    SysCtlDelay (Delay1);
    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3,0);
    SysCtlDelay(Delay2);
    	}
    
    
    
    
    int main(void)
    {
    /*----------- 设置系统时钟(SYSCLK)--------------- */
    
    SysctlClockSet( sysctl_SYSDIV_10 | sysctl_OSC主| sysctl_XTAL_16MHz );// SYSCLK设置为20 MHz (称为“ticks”)
    
    /*----------- 启用外围设备端口:GPIOF --------------------------- */
    
    SysctlPeripheralEnable( sysctl_Periph_GPIOF );//启用GPIO:端口F
    while (!SysPeripheralReady(sysctl_Periph_GPIOF));//此函数确定是否已准备好访问特定外围设备。
    
    	//将GPIO引脚设置为输出
    
    GPIOPinTypeGPIOOutput (GPIO _PORTF_BASE,GPIO PIN_1 | GPIO PIN_2 | GPIO PIN_3);
    	
    /*----------- 用户定义的函数调用--------------------------- */
    
    {
    	void LED_Bllink();//函数调用
    }
    return(0);
    }
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Robert Samuel "]/*--------------- 用户定义的函数调用--------------------------- */{ void LED_Blonce();//函数调用}main()函数只对 LED_Blonce()函数进行一次调用,然后返回main函数。 当main函数返回时,程序将在loader_exit()函数中以无限循环结束,该函数解释了使用调试器中的“恢复”按钮时观察到的行为。

    嵌入式程序通常应始终运行。 对于闪烁的LED程序示例,主功能应连续循环调用LED_Blink功能。 例如,尝试:

    /*----------- 用户定义的函数调用--------------------------- */
    
    同时(1)
    {
    	void LED_Bllink();//函数调用
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chester,

    我尝试在int main(void)之前和之后放置声明,代码生成但不加载,或者加载不正确。 无论哪种情况,代码都不会在目标中运行,我得到的恢复按钮响应与我在上一篇文章中提到的响应类似;片段图像插入到下面。

    我发现使用while (1)会导致代码发出警告并在返回(0)时停止:“#-112D语句无法访问”。

    如果我注释掉,而(1)在返回(0)时没有给出警告,则代码中的任何位置都不显示错误或警告,但是代码生成但不加载,或者加载错误,因此代码不在目标中运行。

    如果我删除减速和呼叫,并将LED闪烁代码放回主代码,则代码将在目标中运行。

    下面插入了代码的副本

    我被骗了!

    感谢你的帮助。

    单击“Resume”(恢复)之前:(顺便说一下,控制台 不再保留完整的文本序列。)

    单击"恢复"后:

    /*项目名称:函数定义和调用测试-1
    *
    写入人:Bob Samuel
    *日期:2017年6月23日
    *
    */
    
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/HW_memmap.h"
    #include "inc/hw_types.glib/gpio
    #debug/verdlib.lib"#include "driverscool/syh"
    
    #lib"driveh/map/dbl"
    
    
    
    
    
    
    
    /*----------- 用户定义的函数原型--------------------------- */
    
    	void LED_Blink ();//此功能使板载RGB LED闪烁
    
    
    /*----------- SysCtlDelay数学(SYSCLK)--------------- */
    //以秒为单位延迟的子例程
    //SYSCLK设置为20MHz = 1/MHz = 2000万 = 0.0.0005万 秒(50ns)= 3个时钟周期* 50ns =每个时钟周期150ns
    //1秒= 100万 ,000ns / 150ns =~ 666.6667万时钟周期:.5秒= 6666.6667万/2=3333333333:33.33333333亿:0.25秒= 333.3333万/2 = 1666667:.125秒= 16666667/2 = 83.3334万
    
    未
    签名长时钟周期1=83333334;//时钟周期数-1 (SysDelay)=无符号长时钟周期2=83.3334万 	//时钟周期数-2 (SysCtlDelay)
    
    /*--------------- 用户定义的函数声明--------------------------- */
    
    	void LED_Blink ()//函数声明
    
    	/*--------------- 闪烁板载RGB LED的代码--------------------------- */
    {
    	int a;
    
    		for (a=0;a<3;a=a+1)
    
    			{
    
    			GPIOPinWrite(GPIO_PORTF_BASE,GPIO PIN_1,GPIO PIN_1,PIN_1);//板载三色LED -红色
    			控制延迟(Delay1);
    			GPIOWrite (GPIO_PORTF_BASE,GPIO_PIN_1,
    			Pin_PIC_1),控制
    
    			2 GPIO_PIN_2);//板载三色LED -蓝色
    			SysCtlDelay (Delay1);
    			GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_2,0);
    			SysCLELDelay (Delay2);
    
    			GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_3, GPIO _PIN_3);//板载三色LED -绿色
    			SysCtlDelay(Delay1);
    			GPIOPinWrite(GPIO_PORTF_BASE,GPIO PIN_3,0);
    			SysCtlDelay(Delay2);
    
    			}
    int
    
    
    main(void)
    {/*---------------
    
    	设置系统时钟(SYSCLK)--------------- */
    
    	SysctlClockSet( sysctl_SYSDIV_10 | sysctl_OSC主| sysctl_XTAL_16MHz );// SYSCLK设置为20 MHz (称为“ticks”)
    
    
    
    	/*----------- 启用外围设备端口:GPIOF --------------------------- */
    
    	SysCtlPeripheralEnable( sysctl_Periph_GPIOF );//启用GPIO:端口F
    	while (!SysPeripheralReady(sysctl_Periph_GPIOF));//此函数确定是否已准备好访问特定外设。
    
    	//将GPIO引脚设置为输出
    
    	GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO PIN_1 | GPIO PIN_2 | GPIO PIN_3);
    
    
    	/*----------- 用户定义的函数调用--------------------------- */
    
    		while (1)
    		{
    		void LED_Bllink();//函数调用
    		}
    
    
    return(0);//上述警告消息位于代码的边距中,未捕获
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    \n代码副本插入到下面

    我已在EK-TM4C123GXL上运行该代码,并且在使用TI ARM编译器编译时,会重复出现LED不闪烁的问题。

    意识到问题是在函数调用中void限定符导致编译器删除函数调用:

    /*----------- 用户定义的函数调用--------------------------- */
    
    同时(1)
    {
    void LED_Bllink();//函数调用
    } 

    要解决此问题,请更改代码以删除void限定符(当我建议之前更改代码以添加while循环时,我错过了此限定符)。 例如,将函数调用更改为:

    /*----------- 用户定义的函数调用--------------------------- */
    
    同时(1)
    {
    LED_Blink();//函数调用
    } 

    通过此更改,程序使启动板上的三色LED闪烁。

    I found that using while(1) causes the code to给出a warning,and appears to stop at return(0):"#-112D statement is unreachable "。

    这是有效的编译器警告,因为使用while(1)循环,程序不会从main函数返回。  可以删除return(0),以防止出现警告。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chester,

    感谢您的时间,帮助和及时响应。 它现在可以工作了!

    由于您的时间和知识,我学到了很多重要的基本教程,包括在C语言中创建和使用函数,以及While (1)声明的主要操作方式

    再次感谢您的帮助。

    Bob