打印
[Atmel]

ATMEL SAMC21 usart引脚切换

[复制链接]
3856|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
serenade753|  楼主 | 2015-9-17 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 serenade753 于 2015-9-17 16:54 编辑

遇到一个问题

void configure_usart(void)                                                                                                                                //配置USART
{
        struct usart_config config_usart;
        usart_get_config_defaults(&config_usart);                                                                                        //配置USART默认值

        //! [setup_change_config]
        config_usart.baudrate    = 9600;
        config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;                                                                        //TX,RX引脚选择
        config_usart.pinmux_pad0 =0;                                                                                                                //端口使能/禁能
        config_usart.pinmux_pad1 =0;                                                                                                            //端口使能/禁能
        config_usart.pinmux_pad2 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        config_usart.pinmux_pad3 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        //! [setup_change_config]

        while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){}                        //通信接口选择SERCOM3
        
        usart_enable(&usart_instance);                                                                                                                //USART使能
}

void configure_usarta(void)                                                                                                                                //配置USART
{
        struct usart_config config_usart;
        usart_get_config_defaults(&config_usart);                                                                                        //配置USART默认值

        //! [setup_change_config]
        config_usart.baudrate    = 9600;
        config_usart.mux_setting =USART_RX_1_TX_2_XCK_3;                                                                        //TX,RX引脚选择
        config_usart.pinmux_pad0 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        config_usart.pinmux_pad1 =0;                                                                                                            //端口使能/禁能
        config_usart.pinmux_pad2 =0;                                                                                                                //端口使能/禁能
        config_usart.pinmux_pad3 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        //! [setup_change_config]

        while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){}                        //通信接口选择SERCOM3
        
        usart_enable(&usart_instance);                                                                                                                //USART使能
}


初始化只配置了configure_usart();
但是在后面的额代码中,需要配置configure_usarta();也就是说两次配置USART的引脚不一样;
但是始终不能通过软件去切换,请大家帮忙看看,谢谢~~~
:(

相关下载

相关帖子

沙发
ddllxxrr| | 2015-9-17 21:53 | 只看该作者
楼主第一个USART好用么???
我用的是SAML21,

关于SERCOM3的宏定义在saml21e15a.h

中,

/* ========== PORT definition for SERCOM3 peripheral ========== */
#define PIN_PA16D_SERCOM3_PAD0            16L  /**< \brief SERCOM3 signal: PAD0 on PA16 mux D */
#define MUX_PA16D_SERCOM3_PAD0             3L
#define PINMUX_PA16D_SERCOM3_PAD0  ((PIN_PA16D_SERCOM3_PAD0 << 16) | MUX_PA16D_SERCOM3_PAD0)
#define PORT_PA16D_SERCOM3_PAD0    (1ul << 16)
#define PIN_PA22C_SERCOM3_PAD0            22L  /**< \brief SERCOM3 signal: PAD0 on PA22 mux C */
#define MUX_PA22C_SERCOM3_PAD0             2L
#define PINMUX_PA22C_SERCOM3_PAD0  ((PIN_PA22C_SERCOM3_PAD0 << 16) | MUX_PA22C_SERCOM3_PAD0)
#define PORT_PA22C_SERCOM3_PAD0    (1ul << 22)
#define PIN_PA27F_SERCOM3_PAD0            27L  /**< \brief SERCOM3 signal: PAD0 on PA27 mux F */
#define MUX_PA27F_SERCOM3_PAD0             5L
#define PINMUX_PA27F_SERCOM3_PAD0  ((PIN_PA27F_SERCOM3_PAD0 << 16) | MUX_PA27F_SERCOM3_PAD0)
#define PORT_PA27F_SERCOM3_PAD0    (1ul << 27)
#define PIN_PA17D_SERCOM3_PAD1            17L  /**< \brief SERCOM3 signal: PAD1 on PA17 mux D */
#define MUX_PA17D_SERCOM3_PAD1             3L
#define PINMUX_PA17D_SERCOM3_PAD1  ((PIN_PA17D_SERCOM3_PAD1 << 16) | MUX_PA17D_SERCOM3_PAD1)
#define PORT_PA17D_SERCOM3_PAD1    (1ul << 17)
#define PIN_PA23C_SERCOM3_PAD1            23L  /**< \brief SERCOM3 signal: PAD1 on PA23 mux C */
#define MUX_PA23C_SERCOM3_PAD1             2L
#define PINMUX_PA23C_SERCOM3_PAD1  ((PIN_PA23C_SERCOM3_PAD1 << 16) | MUX_PA23C_SERCOM3_PAD1)
#define PORT_PA23C_SERCOM3_PAD1    (1ul << 23)
#define PIN_PA18D_SERCOM3_PAD2            18L  /**< \brief SERCOM3 signal: PAD2 on PA18 mux D */
#define MUX_PA18D_SERCOM3_PAD2             3L
#define PINMUX_PA18D_SERCOM3_PAD2  ((PIN_PA18D_SERCOM3_PAD2 << 16) | MUX_PA18D_SERCOM3_PAD2)
#define PORT_PA18D_SERCOM3_PAD2    (1ul << 18)
#define PIN_PA24C_SERCOM3_PAD2            24L  /**< \brief SERCOM3 signal: PAD2 on PA24 mux C */
#define MUX_PA24C_SERCOM3_PAD2             2L
#define PINMUX_PA24C_SERCOM3_PAD2  ((PIN_PA24C_SERCOM3_PAD2 << 16) | MUX_PA24C_SERCOM3_PAD2)
#define PORT_PA24C_SERCOM3_PAD2    (1ul << 24)
#define PIN_PA19D_SERCOM3_PAD3            19L  /**< \brief SERCOM3 signal: PAD3 on PA19 mux D */
#define MUX_PA19D_SERCOM3_PAD3             3L
#define PINMUX_PA19D_SERCOM3_PAD3  ((PIN_PA19D_SERCOM3_PAD3 << 16) | MUX_PA19D_SERCOM3_PAD3)
#define PORT_PA19D_SERCOM3_PAD3    (1ul << 19)
#define PIN_PA25C_SERCOM3_PAD3            25L  /**< \brief SERCOM3 signal: PAD3 on PA25 mux C */
#define MUX_PA25C_SERCOM3_PAD3             2L
#define PINMUX_PA25C_SERCOM3_PAD3  ((PIN_PA25C_SERCOM3_PAD3 << 16) | MUX_PA25C_SERCOM3_PAD3)
#define PORT_PA25C_SERCOM3_PAD3    (1ul << 25)

我的意思是说,你要换管脚也得按这个宏定义来进行

使用特权

评论回复
板凳
shaoziyang| | 2015-9-17 22:42 | 只看该作者
没有试过C21。

使用特权

评论回复
地板
serenade753|  楼主 | 2015-9-18 09:03 | 只看该作者
ddllxxrr 发表于 2015-9-17 21:53
楼主第一个USART好用么???
我用的是SAML21,

后来代码改了

void configure_usart(void)                                                                                                                                //配置USART
{
        struct usart_config config_usart;
        usart_get_config_defaults(&config_usart);                                                                                        //配置USART默认值

        //! [setup_change_config]
        config_usart.baudrate    = 115200;
        config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;                                                                        //TX,RX引脚选择
        config_usart.pinmux_pad0 =PINMUX_PA22C_SERCOM3_PAD0;                                                                //端口使能/禁能
        config_usart.pinmux_pad1 =PINMUX_PA23C_SERCOM3_PAD1;                                                                //端口使能/禁能
        config_usart.pinmux_pad2 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        config_usart.pinmux_pad3 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        //! [setup_change_config]

        while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){}                        //通信接口选择SERCOM3
       
        usart_enable(&usart_instance);                                                                                                                //USART使能
}

void configure_usarta(void)                                                                                                                                //配置USART
{
        struct usart_config config_usart;
        usart_get_config_defaults(&config_usart);                                                                                        //配置USART默认值

        //! [setup_change_config]
        config_usart.baudrate    = 9600;
        //config_usart.mux_setting =USART_RX_1_TX_2_XCK_3;                                                                        //TX,RX引脚选择
        config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;       
        config_usart.pinmux_pad0 =PINMUX_PA22C_SERCOM3_PAD0;                                                                //端口使能/禁能
        config_usart.pinmux_pad1 =PINMUX_PA23C_SERCOM3_PAD1;                                                                //端口使能/禁能
        config_usart.pinmux_pad2 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        config_usart.pinmux_pad3 =PINMUX_UNUSED;                                                                                        //端口使能/禁能
        //! [setup_change_config]

        while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){}                        //通信接口选择SERCOM3
       
        usart_enable(&usart_instance);                                                                                                                //USART使能
}

初始化2次usart,两次无非是波特率不一样,但是只有第一次配置成功,第二次修改没有效果

使用特权

评论回复
5
ddllxxrr| | 2015-9-18 15:32 | 只看该作者
本帖最后由 ddllxxrr 于 2015-9-18 15:33 编辑
serenade753 发表于 2015-9-18 09:03
后来代码改了

void configure_usart(void)                                                                                                                                //配置USART

你在初始化第二个时,把串口先停了先
usart_disable(&usart_instance);然后再初始化,反正最后一行是使能串口,也就是说你在两个初始化之间加个,上边那句就好用了

使用特权

评论回复
6
serenade753|  楼主 | 2015-9-21 15:11 | 只看该作者
ddllxxrr 发表于 2015-9-18 15:32
你在初始化第二个时,把串口先停了先
usart_disable(&usart_instance);然后再初始化,反正最后一行是使能 ...

谢谢~~你说的非常正确~这个问题我已经搞定,现在和大家分享一下~
官方有两个例程,先说第一个
usart_basic_usel例程
int main(void)
{
        system_init();
        configure_usart();             //波特率9600

        uint8_t string[] = "Hello World!\r\n";
        usart_write_buffer_wait(&usart_instance, string, sizeof(string));

        uint16_t temp;

        usart_disable(&usart_instance);  //先disable
        configure_usart1();                  //再配置新参数,波特率115200
       
        while (true) {
               
                if (usart_read_wait(&usart_instance, &temp) == STATUS_OK) {
                        while (usart_write_wait(&usart_instance, temp) != STATUS_OK) {
                        }
                }
        }
}

第二个例程,callback函数
int main(void)
{
        system_init();
        delay_init();

        configure_usart();
        configure_usart_callbacks();

        system_interrupt_enable_global();

        uint8_t string[] = "Hello World!\r\n";
        usart_write_buffer_wait(&usart_instance, string, sizeof(string));

        usart_unregister_callback(&usart_instance, USART_CALLBACK_BUFFER_TRANSMITTED);
        usart_unregister_callback(&usart_instance, USART_CALLBACK_BUFFER_RECEIVED);
        usart_disable_callback(&usart_instance, USART_CALLBACK_BUFFER_TRANSMITTED);
        usart_disable_callback(&usart_instance, USART_CALLBACK_BUFFER_RECEIVED);

        usart_disable(&usart_instance);
        configure_usarta();
        configure_usart_callbacks();
       
        delay_s(5);
        usart_write_buffer_wait(&usart_instance, string, sizeof(string));
                usart_write_buffer_wait(&usart_instance, string, sizeof(string));
                        usart_write_buffer_wait(&usart_instance, string, sizeof(string));

        while (true) {

                usart_read_buffer_job(&usart_instance,
                                (uint8_t *)rx_buffer, MAX_RX_BUFFER_LENGTH);
        }
}

我一直纠结于callback函数的例程,没有想到将callback函数也disable掉,再config usart->enable usart->enable callback,大家可以作为参考,哈哈~

使用特权

评论回复
7
ddllxxrr| | 2015-9-21 15:17 | 只看该作者
serenade753 发表于 2015-9-21 15:11
谢谢~~你说的非常正确~这个问题我已经搞定,现在和大家分享一下~
官方有两个例程,先说第一个
usart_basi ...

楼主竟然专研到如此,真是佩服

使用特权

评论回复
8
serenade753|  楼主 | 2015-9-21 15:21 | 只看该作者
ddllxxrr 发表于 2015-9-21 15:17
楼主竟然专研到如此,真是佩服

第一次用ATMEL的ARM芯片,还要多向大家多请教啊,加油!

使用特权

评论回复
9
mycent| | 2015-10-11 13:46 | 只看该作者
楼主再专研下:
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;  
这句是什么意思?
/** MUX setting RX_0_TX_0_XCK_1 */
USART_RX_0_TX_0_XCK_1 = (SERCOM_USART_CTRLA_RXPO(0)),
/** MUX setting RX_0_TX_2_XCK_3 */
USART_RX_0_TX_2_XCK_3 = (SERCOM_USART_CTRLA_RXPO(0) | SERCOM_USART_CTRLA_TXPO),
/** MUX setting RX_1_TX_0_XCK_1 */
USART_RX_1_TX_0_XCK_1 = (SERCOM_USART_CTRLA_RXPO(1)),
/** MUX setting RX_1_TX_2_XCK_3 */
USART_RX_1_TX_2_XCK_3 = (SERCOM_USART_CTRLA_RXPO(1) | SERCOM_USART_CTRLA_TXPO),
/** MUX setting RX_2_TX_0_XCK_1 */
USART_RX_2_TX_0_XCK_1 = (SERCOM_USART_CTRLA_RXPO(2)),
/** MUX setting RX_2_TX_2_XCK_3 */
USART_RX_2_TX_2_XCK_3 = (SERCOM_USART_CTRLA_RXPO(2) | SERCOM_USART_CTRLA_TXPO),
/** MUX setting RX_3_TX_0_XCK_1 */
USART_RX_3_TX_0_XCK_1 = (SERCOM_USART_CTRLA_RXPO(3)),
/** MUX setting RX_3_TX_2_XCK_3 */
USART_RX_3_TX_2_XCK_3 = (SERCOM_USART_CTRLA_RXPO(3) | SERCOM_USART_CTRLA_TXPO),
为何选USART_RX_1_TX_0_XCK_1,不选其它定义,其它定义是什么含义呢。

使用特权

评论回复
10
serenade753|  楼主 | 2015-11-16 17:38 | 只看该作者
mycent 发表于 2015-10-11 13:46
楼主再专研下:
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;  
这句是什么意思?

你好,很久没来,才看到你的问题。

使用特权

评论回复
11
serenade753|  楼主 | 2015-11-16 17:49 | 只看该作者
mycent 发表于 2015-10-11 13:46
楼主再专研下:
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;  
这句是什么意思?

SERCOM3/PAD[0]
SERCOM3/PAD[1]
SERCOM3/PAD[2]
SERCOM3/PAD[3]

config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;//复用功能,RX_1为PAD[1],TX_0为PAD[0]

使用特权

评论回复
12
lzgztm5211314| | 2020-11-19 14:33 | 只看该作者
请教楼主,SAMC21的Serial Number如何读取,datasheet里面说有一个128bit的序列号,但是没有例程怎么读出来。请教

使用特权

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

本版积分规则

3

主题

18

帖子

0

粉丝