第5週-ARUIX(5)


TASKINGプロジェクト初期設定
  • File-Import General-Existing Projects-Root Directory Brows-workspace AURiXをルート-myProject(ルートディレクトリに1つだけ残し、メタデータに記録するとすべて削除)
  • Include Path、Optimization level、MISRA-C、Show line num等必要な設定
  • AUTOSARポートピンドライバの実装
  • AUTOSAR_SWS_PortDriver.PDFの表示Port SetPinDirition、Port SetPinMode関数
  • の作成
  • AUTOSAR_SWS_DIODriver.pdfを使用してDio WriteChannelおよびDio ReadChannel関数
  • を作成
    コースの概要:
    TC 27 xメモリマッピングを含むヘッダファイルとAUTOSAR Driver形式のPDFファイルを使用して、TC 275 TPマザーボードメモリアドレスに値を入力できる関数を作成します.
    コードを書く時、MISRA-C、AUTOSAR形式に従うべきで、値を入力する時ビット数はビットフィールド構造体がタイトルの中にあるので、F 3キーを押して確定して、もし理解しないならば、メニューと比較して、そしてランダムに個人変数(例えばpinnumber、channel ID)を指定して使用します.
    構築後ルータバッハデバッガに接続し、T 32でデバッグし、LDを押してgoまたはStepでコード挙動を確認し、LDがダメならRun Script-T 32-demo-tricore-flash-tc 27 x.cmm(他の物に触ると壊れちゃう!)
    /*****************************************************
     *
     * my_project.c
     *
     * Description : Hello World in C, ANSI-style
     *
     */
    
    typedef signed int int32_t;
    typedef unsigned int uint32_t;
    typedef signed char int8_t;
    typedef unsigned char uint8_t;
    typedef signed short int16_t;
    typedef unsigned short uint16_t;
    
    typedef uint32_t Port_PinType;
    typedef uint32_t Port_PinModeType;
    typedef uint8_t Dio_LevelType;
    typedef uint32_t Dio_ChannelType;
    
    #include "IfxPort_reg.h"
    
    typedef enum
    {
    	PORT_PIN_IN = 0x0U,
    	PORT_PIN_OUT = 0x1U
    }Port_PinDirectionType;
    
    
    #define PORT_PIN_MODE_GPIO 		(0x0U)
    #define PORT_PIN_MODE_ALT1 		(0x1U)
    #define PORT_PIN_MODE_ALT2 		(0x2U)
    #define PORT_PIN_MODE_ALT3 		(0x3U)
    #define PORT_PIN_MODE_ALT4 		(0x4U)
    #define PORT_PIN_MODE_ALT5 		(0x5U)
    #define PORT_PIN_MODE_ALT6 		(0x6U)
    #define PORT_PIN_MODE_ALT7 		(0x7U)
    
    #define P11_6 		(0x100U) // LED pin
    //#define P11_7		(0x101U)
    
    #define STD_LOW   (0x00U)
    #define	STD_HIGH  (0x01U)
    
    
    void Dio_WriteChannel(Dio_ChannelType ChannelId, Dio_LevelType Level)
    {
    	switch(ChannelId)
    		{
    			case P11_6 :
    				MODULE_P11.OUT.B.P6 = Level;
    				break;
    	//		case P11_7 :
    	//			MODULE_P11.OUT.B.P7 = Level;
    	//			break;
    			default :
    				break;
    		}
    }
    Dio_LevelType Dio_ReadChannel(Dio_ChannelType ChannelId)
    {
    	switch(ChannelId)
    			{
    				case P11_6 :
    					return MODULE_P11.OUT.B.P6;
    //				case P11_7 :
    //					return MODULE_P11.OUT.B.P6;
    				default :
    					return 0; // 예외처리 필요
    			}
    }
    
    void Port_SetPinDirection(Port_PinType Pin, Port_PinDirectionType Direction)
    {
    	MODULE_P11.IOCR4.B.PC6 &= ~(0x1)<<4;
    	MODULE_P11.IOCR4.B.PC6 |= Direction << 4; // 0xF003B114 주소 19번 자리부터 4번째, 23번자리 In/Out 결정
    
    }
    void Port_SetPinMode(Port_PinType Pin, Port_PinModeType Mode)
    {
    	switch(Pin)
    	{
    		case P11_6 :
    			MODULE_P11.IOCR4.B.PC6 &= ~(0xF);
    			MODULE_P11.IOCR4.B.PC6 |= Mode; // 0xF003B114 주소 19번 자리부터 Mode 결정
    			break;
    //		case P11_7 :
    //			MODULE_P11.IOCR4.B.PC6 &= ~(0xF);
    //			MODULE_P11.IOCR4.B.PC6 |= Mode;
    //			break;
    		default :
    			break;
    	}
    }
    
    
    int32_t main(void)
    {
    	volatile uint8_t led_state;
    
    	Port_SetPinDirection(P11_6, PORT_PIN_OUT);
    	Port_SetPinMode(P11_6, PORT_PIN_MODE_GPIO);
    
    	Dio_WriteChannel(P11_6, STD_HIGH);
    	led_state = Dio_ReadChannel(P11_6);
    
    	Dio_WriteChannel(P11_6, STD_LOW);
    	led_state = Dio_ReadChannel(P11_6);
    
    	Dio_WriteChannel(P11_6, STD_HIGH);
    	led_state = Dio_ReadChannel(P11_6);
    
    	Dio_WriteChannel(P11_6, STD_LOW);
    	led_state = Dio_ReadChannel(P11_6);
    
    	for(;;)
    	{
    		Dio_WriteChannel(P11_6, STD_HIGH);
    		for(uint32_t i=0; i<0xffffff; i++);
    		Dio_WriteChannel(P11_6, STD_LOW);
    		for(uint32_t i=0; i<0xffffff; i++);
    	}
    }
    
    SetPinDirection関数、SetPinMode関数
    ユーザメニューのP 11 baseaddressには0 xF 003 B 100、ヘッダファイルから投影ファイルが表示されます
    TC 27 xメモリマッピングの有効化
    MODULE_P11.IOCR4.B.PC6 |= Direction << 4;
    //0 xF 003 B 114アドレス19~4、23ビット入出力決定
    //前のビットフィールド構造チェーン0 xF 003 B 114アドレスへのポインタ変数
    開けてみると、
    #define MODULE_P11  (*(Ifx_P*)0xF003B100u)
    
    typedef volatile struct _Ifx_P
    {
        Ifx_P_OUT OUT;                          /**< \brief 0, Port Output Register */
        Ifx_P_OMR OMR;                          /**< \brief 4, Port Output Modification Register */
        Ifx_P_ID ID;                            /**< \brief 8, Identification Register */
        unsigned char reserved_C[4];            /**< \brief C, \internal Reserved */
        Ifx_P_IOCR0 IOCR0;                      /**< \brief 10, Port Input/Output Control Register 0 */
        Ifx_P_IOCR4 IOCR4;                      /**< \brief 14, Port Input/Output Control Register 4 */
        Ifx_P_IOCR8 IOCR8;                      /**< \brief 18, Port Input/Output Control Register 8 */
        Ifx_P_IOCR12 IOCR12;                    /**< \brief 1C,Port Input/Output Control Register 12 */
        ...
    } Ifx_P;
    
    typedef union
    {
        unsigned int U;                         /**< \brief Unsigned access */
        signed int I;                           /**< \brief Signed access */
        Ifx_P_IOCR4_Bits B;                     /**< \brief Bitfield access */
    } Ifx_P_IOCR4;
    
    typedef struct _Ifx_P_IOCR4_Bits
    {
        unsigned int reserved_0:3;              /**< \brief \internal Reserved */
        unsigned int PC4:5;                     /**< \brief [7:3]  (rw) */
        unsigned int reserved_8:3;              /**< \brief \internal Reserved */
        unsigned int PC5:5;                     /**< \brief [15:11]  (rw) */
        unsigned int reserved_16:3;             /**< \brief \internal Reserved */
        unsigned int PC6:5;                     /**< \brief [23:19]  (rw) */
        unsigned int reserved_24:3;             /**< \brief \internal Reserved */
        unsigned int PC7:5;                     /**< \brief [31:27]  (rw) */
    } Ifx_P_IOCR4_Bits;
    
    ビットフィールド構造体の作成方法
    struct MY_STRUCT // 32바이트 아니고 32비트짜리 구조체
    {
    	unsigned int A:3;
    	unsigned int B:5;
    	unsigned int C:3;
    	unsigned int D:5;
    	unsigned int E:3;
    	unsigned int F:5;
    	unsigned int G:3;
    	unsigned int H:5;
    };
    
    int32_t main(void)
    {
    	volatile struct MY_STRUCT var;
    	for(;;)
    	{
    		var.A = 0x7; // MY_STRUCT 주소 가서 [2:0] 111
    		var.B = 0x10; // MY_STRUCT 주소 가서 [7:3] 10000
    	}
    }