ATMEL SAMC21 usart引脚切换
本帖最后由 serenade753 于 2015-9-17 16:54 编辑遇到一个问题
void configure_usart(void) //配置USART
{
struct usart_config config_usart;
usart_get_config_defaults(&config_usart); //配置USART默认值
//!
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; //端口使能/禁能
//!
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默认值
//!
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; //端口使能/禁能
//!
while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){} //通信接口选择SERCOM3
usart_enable(&usart_instance); //USART使能
}
初始化只配置了configure_usart();
但是在后面的额代码中,需要配置configure_usarta();也就是说两次配置USART的引脚不一样;
但是始终不能通过软件去切换,请大家帮忙看看,谢谢~~~:( 楼主第一个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)
我的意思是说,你要换管脚也得按这个宏定义来进行 没有试过C21。 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默认值
//!
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; //端口使能/禁能
//!
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默认值
//!
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; //端口使能/禁能
//!
while (usart_init(&usart_instance,SERCOM3, &config_usart) != STATUS_OK){} //通信接口选择SERCOM3
usart_enable(&usart_instance); //USART使能
}
初始化2次usart,两次无非是波特率不一样,但是只有第一次配置成功,第二次修改没有效果 本帖最后由 ddllxxrr 于 2015-9-18 15:33 编辑
serenade753 发表于 2015-9-18 09:03
后来代码改了
void configure_usart(void) //配置USART
你在初始化第二个时,把串口先停了先
usart_disable(&usart_instance);然后再初始化,反正最后一行是使能串口,也就是说你在两个初始化之间加个,上边那句就好用了
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,大家可以作为参考,哈哈~ serenade753 发表于 2015-9-21 15:11
谢谢~~你说的非常正确~这个问题我已经搞定,现在和大家分享一下~
官方有两个例程,先说第一个
usart_basi ...
楼主竟然专研到如此,真是佩服 ddllxxrr 发表于 2015-9-21 15:17
楼主竟然专研到如此,真是佩服
第一次用ATMEL的ARM芯片,还要多向大家多请教啊,加油! 楼主再专研下:
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,不选其它定义,其它定义是什么含义呢。 mycent 发表于 2015-10-11 13:46
楼主再专研下:
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;
这句是什么意思?
你好,很久没来,才看到你的问题。 mycent 发表于 2015-10-11 13:46
楼主再专研下:
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;
这句是什么意思?
SERCOM3/PAD
SERCOM3/PAD
SERCOM3/PAD
SERCOM3/PAD
config_usart.mux_setting =USART_RX_1_TX_0_XCK_1;//复用功能,RX_1为PAD,TX_0为PAD 请教楼主,SAMC21的Serial Number如何读取,datasheet里面说有一个128bit的序列号,但是没有例程怎么读出来。请教
页:
[1]