[Atmel] SAML21走起26:SERCOM 串口中断方式

[复制链接]
1774|0
 楼主| ddllxxrr 发表于 2015-9-23 22:12 | 显示全部楼层 |阅读模式
由于上次做串口切换,还是因为别的,我在搞中断时,几次都没成功,

归结原因是,上次管脚切换是一方面,还有一方面是中断除了定义以外必须使能。

我没有使能所心不好用。现在才搞定。

首先,从ASF EXPLORER中找到指导说明。然后形成程序。

程序如下:
  1. #include <asf.h>
  2. #include <stdio.h>

  3. void usart_read_callback(struct usart_module *const usart_module);
  4. void usart_write_callback(struct usart_module *const usart_module);

  5. void configure_usart(void);
  6. void configure_usart_callbacks(void);

  7. //! [module_inst]
  8. struct usart_module usart_instance;
  9. //! [module_inst]

  10. //! [rx_buffer_var]
  11. #define MAX_RX_BUFFER_LENGTH   5

  12. volatile uint8_t rx_buffer[MAX_RX_BUFFER_LENGTH];
  13. //! [rx_buffer_var]

  14. //! [callback_funcs]
  15. void usart_read_callback(struct usart_module *const usart_module)
  16. {
  17.         usart_write_buffer_job(&usart_instance,
  18.                         (uint8_t *)rx_buffer, MAX_RX_BUFFER_LENGTH);
  19. }

  20. void usart_write_callback(struct usart_module *const usart_module)
  21. {
  22.         port_pin_toggle_output_level(LED_0_PIN);
  23. }
  24. //! [callback_funcs]

  25. //! [setup]
  26. void configure_usart(void)
  27. {
  28. //! [setup_config]
  29.         struct usart_config config_usart;
  30. //! [setup_config]
  31. //! [setup_config_defaults]
  32.         usart_get_config_defaults(&config_usart);
  33. //! [setup_config_defaults]

  34. //! [setup_change_config]
  35.         config_usart.baudrate    = 9600;
  36.         config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
  37.         config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
  38.         config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
  39.         config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
  40.         config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
  41. //! [setup_change_config]

  42. //! [setup_set_config]
  43.         while (usart_init(&usart_instance,
  44.                         EDBG_CDC_MODULE, &config_usart) != STATUS_OK) {
  45.         }
  46. //! [setup_set_config]

  47. //! [setup_enable]
  48.         usart_enable(&usart_instance);
  49. //! [setup_enable]
  50. }

  51. void configure_usart_callbacks(void)
  52. {
  53. //! [setup_register_callbacks]
  54.         usart_register_callback(&usart_instance,
  55.                         usart_write_callback, USART_CALLBACK_BUFFER_TRANSMITTED);
  56.         usart_register_callback(&usart_instance,
  57.                         usart_read_callback, USART_CALLBACK_BUFFER_RECEIVED);
  58. //! [setup_register_callbacks]

  59. //! [setup_enable_callbacks]
  60.         usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_TRANSMITTED);
  61.         usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_RECEIVED);
  62. //! [setup_enable_callbacks]
  63. }
  64. //! [setup]

  65. int main(void)
  66. {
  67.         system_init();

  68. //! [setup_init]
  69.         configure_usart();
  70.         configure_usart_callbacks();
  71. //! [setup_init]

  72. //! [main]
  73. //! [enable_global_interrupts]
  74.         system_interrupt_enable_global();
  75. //! [enable_global_interrupts]

  76. //! [main_send_string]
  77.         uint8_t string[] = "Hello World!\r\n";
  78.         usart_write_buffer_wait(&usart_instance, string, sizeof(string));
  79. //! [main_send_string]

  80. //! [main_loop]
  81.         while (true) {
  82. //! [main_loop]
  83. //! [main_read]
  84.                 usart_read_buffer_job(&usart_instance,
  85.                                 (uint8_t *)rx_buffer, MAX_RX_BUFFER_LENGTH);
  86. //! [main_read]
  87.         }
  88. //! [main]
  89. }
运行结果如下:
先打印出一行信息,接着用户只要输入五个字符或数字,就马上在串口打印出来。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部