标题:
编程点滴:AVR UART I/O 功能模块
[打印本页]
作者:
yuchengze
时间:
2016-10-22 10:09
标题:
编程点滴:AVR UART I/O 功能模块
本程序实现
AVR
设备
UART
端口<输入/回显/格式化输出>功能,由此可以通过PC机终端软件与设备直接交互。
程序有参考Samsung S3C2440库文件。
程序组成:测试程序
,
功能模块
<
uart
.c>及其头文件。
/* ******************************************************
* File Name: main.c
* Function: AVR UART
I
/
O
功能模块
* Description: 实现UART输入/回显/格式化输出功能, 方便程序调试
* Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新
* ******************************************************/
#include
#include
#include
#include
#include
#include "uart.h"
#include "step_motor.h"
#include "hardware.h"
/* 测试程序 */
void main(void)
{
u16 n;
u8 s[20];
uart_init(9600);
_SEI();
while (1) {
uart_putstring("Please input a number: ");
n = uart_getnum();
uart_putstring("Please input a string: ");
uart_getstring(s);
uart_printf("number: %d, string: \"%s\"\n", n, s);
_WDR();
}
}
/* ******************************************************
* File Name: uart.h
* Function: AVR UART I/O 功能模块
* Description: 实现UART输入/回显/格式化输出功能, 方便程序调试
* Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新
* ******************************************************/
#ifndef _UART_H
#define _UART_H
#include "hardware.h"
/* UART初始化 */
void uart_init(u32 baud);
/* 读1字节, 无数据则忙等 */
u8 uart_getchar(void);
/* 尝试读1字节, 无数据返回0, 可用于检测按键 */
u8 uart_getkey(void);
/* 接收字符串, 并回显, 需在参数中给定字符串存放位置 */
void uart_getstring(u8 *str);
/* 接收整型数, 支持8进制/10进制/16进制输入 */
u16 uart_getnum(void);
/* 写1字节, 发送缓冲器满则忙等 */
void uart_putchar(u8 data);
/* 字符串输出 */
void uart_putstring(u8 *str);
/* 格式化输出, 不支持
浮点数
*/
void uart_printf(const u8 *fmt, ...);
#endif
/* ****************************************************** * File Name: uart.c * Function: AVR UART I/O 功能模块 * Description: 实现UART输入/回显/格式化输出功能, 方便程序调试 * Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新 * ******************************************************/#include #include #include #include <io
avr
.h>#include #include #include #include "uart.h"/* UART初始化 */void uart_init(u32 baud){ u16 ubrr; /* 设置baudrate */ ubrr = (u16)((FOSC / (8 * baud)) - 1); UBRR0H = (u8)(ubrr >> 8); UBRR0L = (u8)ubrr; /* 倍速发送 */ UCSR0A |= 1 << U2X0; /* 设置帧格式: 8个数据位, 1个停止位 */ UCSR0C = 3 << UCSZ00; /* 使能: 接收结束中断, 接收, 发送 */ UCSR0B = (1<<rxcie0) |="" (1<<rxen0)="" (1<<txen0);="" }="" *="" 接收结束中断处理函数="" #pragma="" vector="USART0_RXC_vect" __
interrupt
void uart_rxc_isr_orig(void){ //uart_rxc_isr();}/* 数据寄存器空中断处理函数 */#pragma vector = USART0_UDRE_vect__interrupt void uart_udre_isr_orig(void){ //uart_udre_isr();}/* 读1字节, 无数据则忙等 */u8 uart_getchar(void){ if (TESTBIT(UCSR0B, RXCIE0)) CLEARBIT(UCSR0B, RXCIE0); while (!(UCSR0A & (1 << RXC0))) _WDR(); return UDR0;}/* 尝试读1字节, 无数据返回0, 可用于检测按键 */u8 uart_getkey(void){ if (UCSR0A & (1 << RXC0)) return UDR0; else return 0;}/* 接收字符串, 并回显, 需在参数中给定字符串存放位置 */void uart_getstring(u8 *str){ u8 c; u8 *s = str; while ((c = uart_getchar()) != '\r') { if (c == '\b') { if ((str - s) > 0) { uart_putstring("\b \b"); str--; } } else { *str = c; str++; uart_putchar(c); } } *str = '\0'; uart_putchar('\n');}/* 接收整型数, 支持8进制/10进制/16进制输入 */u16 uart_getnum(void){ u8 str[10]; uart_getstring(str); return (u16)strtol((char *)str, NULL, 0);}/* 写1字节, 发送缓冲器满则忙等 */void uart_putchar(u8 data){ while (!(UCSR0A & (1 << UDRE0))) ; UDR0 = data; if (data == '\n') uart_putchar('\r');}/* 字符串输出 */void uart_putstring(u8 *str){#ifdef DEBUG while (*str) uart_putchar(*str++);#endif}/* 格式化输出, 不支持浮点数 */void uart_printf(const u8 *fmt, ...){#ifdef DEBUG u8 str[128]; /* 数组空间尽可能大一些, 以免越界 */ va_list args; va_start(args, fmt); vsprintf((char *)str, (char *)fmt, args); uart_putstring(str); va_end(args);#endif}</io
关键字:
AVR
UART
I
O
功能模块
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0