微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 第一个小程序

第一个小程序

时间:10-02 整理:3721RD 点击:
这个我也是第一次接触arm。本来想着很简单的,没想到耗费了好几天的时间,才把第一个小程序给搞出来。
1.我瞄准了数码管,想让她显示任意的我给的数值。先看一下原理图,

      


a是中间的横杠,dp是小数点。
2.找一下控制管脚的寄存器。在我上传的那份资料里的第21章port中有介绍。
“”The Port (PORT) controls the I/O pins of the microcontroller. The I/O pins are organized in a series of groups, collectively
referred to as a line bundle, and each group can have up to 32 pins that can be configured and controlled individually or
as a group. Each pin may either be used for general-purpose I/O under direct application control or assigned to an
embedded device peripheral. When used for general-purpose I/O, each pin can be configured as input or output, with
highly configurable driver and pull settings.
All I/O pins have true read-modify-write functionality when used for general-purpose I/O; the direction or the output value
of one or more pins may be changed (set, reset or toggled) without unintentionally changing the state of any other pins in
the same line bundle via a single, atomic 8-, 16- or 32-bit write.
The PORT is connected to the high-speed bus matrix through an AHB/APB bridge. The Pin Direction, Data Output Value
and Data Input Value registers may also be accessed using the low-latency CPU local bus (IOBUS; ARM? single-cycle
I/O port)

“”
在对着个寄存器进行操作的时候稍微有点麻烦,这里我就不详细进行介绍了。提示一下,我在这里吃了点亏。
3.在开发软件中有定义好的寄存器的结构体,可以直接拿过来用。
“”
typedef union
{
        struct
        {
                uint32_t DIR:32;           
        } bit;                       
        uint32_t reg;               
} PORT_DIR_Type;
       
typedef union
{
        struct
        {
                uint32_t DIRCLR:32;        
        } bit;                     
        uint32_t reg;               
} PORT_DIRCLR_Type;


typedef union
{
        struct
        {
                uint32_t DIRSET:32;      
        } bit;                       
        uint32_t reg;               
} PORT_DIRSET_Type;
                       
typedef union
{
        struct
        {
                uint32_t DIRTGL:32;      
        } bit;                     
        uint32_t reg;               
} PORT_DIRTGL_Type;
                               
typedef union
{
        struct
        {
                uint32_t OUT:32;         
        } bit;                       
        uint32_t reg;               
} PORT_OUT_Type;
                                       
                                       
typedef union
{
        struct
        {
                uint32_t OUTCLR:32;        
        } bit;                       
        uint32_t reg;               
} PORT_OUTCLR_Type;
                                               
typedef union
{
        struct
        {
                uint32_t OUTSET:32;      
        } bit;                       
        uint32_t reg;               
} PORT_OUTSET_Type;
                                                       
typedef union
{
        struct
        {
                uint32_t OUTTGL:32;      
        } bit;                       
        uint32_t reg;               
} PORT_OUTTGL_Type;
                                                               
typedef union
{
        struct
        {
                uint32_t IN:32;         
        } bit;                       
        uint32_t reg;               
} PORT_IN_Type;
                                                                       




typedef union
{
        struct
        {
                uint32_t SAMPLING:32;      
        } bit;                       
        uint32_t reg;               
} PORT_CTRL_Type;


typedef struct
{
        __IO PORT_DIR_Type             DIR;         /**< \brief Offset: 0x00 (R/W 32) Data Direction */
        __IO PORT_DIRCLR_Type          DIRCLR;      /**< \brief Offset: 0x04 (R/W 32) Data Direction Clear */
        __IO PORT_DIRSET_Type          DIRSET;      /**< \brief Offset: 0x08 (R/W 32) Data Direction Set */
        __IO PORT_DIRTGL_Type          DIRTGL;      /**< \brief Offset: 0x0C (R/W 32) Data Direction Toggle */
        __IO PORT_OUT_Type             OUT;         /**< \brief Offset: 0x10 (R/W 32) Data Output Value */
        __IO PORT_OUTCLR_Type          OUTCLR;      /**< \brief Offset: 0x14 (R/W 32) Data Output Value Clear */
        __IO PORT_OUTSET_Type          OUTSET;      /**< \brief Offset: 0x18 (R/W 32) Data Output Value Set */
        __IO PORT_OUTTGL_Type          OUTTGL;      /**< \brief Offset: 0x1C (R/W 32) Data Output Value Toggle */
        __I  PORT_IN_Type              IN;          /**< \brief Offset: 0x20 (R/  32) Data Input Value */
        __IO PORT_CTRL_Type            CTRL;        /**< \brief Offset: 0x24 (R/W 32) Control */
        __O  PORT_WRCONFIG_Type        WRCONFIG;    /**< \brief Offset: 0x28 ( /W 32) Write Configuration */
        RoReg8                    Reserved1[0x4];
        __IO PORT_PMUX_Type            PMUX[16];    /**< \brief Offset: 0x30 (R/W  8) Peripheral Multiplexing n */
        __IO PORT_PINCFG_Type          PINCFG[32];  /**< \brief Offset: 0x40 (R/W  8) Pin Configuration n */
        RoReg8                    Reserved2[0x20];
} PortGroup;
“”
找到寄存器的地址 这个核分为两个部分只有A和B。A部分的地址是0x41004400,B部分的地址是0x41004480;
4.接着就是直接操作寄存器就可以控制管脚的高低电平了。下面是程序部分,已经实验过的了。
#include <asf.h>
#include <string.h>
int main (void)
{
        system_init();
        delay_init();
        PortGroup *const DD = (PortGroup *)0x41004400;
        PortGroup *const DD1 = (PortGroup *)0x41004480;
        uint32_t i = 0;
        for(i=4;i<12;i++)
        {
        DD->DIRCLR.reg = 1<<i;
        DD->WRCONFIG.reg = 1<<28|1<<30|1<<i;
        DD->OUTSET.reg = 1<<i;
        DD->DIRSET.reg = 1<<i;
        }
        for(i=10;i<12;i++)
        {
                DD1->DIRCLR.reg = 1<<i;
                DD1->WRCONFIG.reg = 1<<28|1<<30|1<<i;
                DD1->OUTSET.reg = 1<<i;
                DD1->DIRSET.reg = 1<<i;
        }
        while (1)
        {
                for (i=4;i<12;i++)
                {
                        DD->OUTCLR.reg = 1<<i;
                        DD1->OUTCLR.reg = 1<<10;
                        delay_cycles(1000000);
                        DD->OUTSET.reg = 1<<i;
                        delay_cycles(1000000);
                }
        }
}


简单学习了解一下  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top