AVR开发笔记
2016-04-19 09:41
204 查看
1、开发环境
采用AvrStudio+WinAVR。先装AvrStudio,再装WinAVR。下载及安装方法见:
http://jingyan.baidu.com/article/8cdccae9487d39315413cd88.html
2、硬件准备
开发板为arduino uno R3,芯片为atmega328p(单独买了一块atmega8),烧录器为Risym,淘宝买的。烧录软件为progisp1.72。芯片资料从atmel官网上下,地址:
http://www.atmel.com/search.aspx?filter=0&btnG=Search&site=en_collection&client=support_frontend&proxystylesheet=support_frontend&output=xml_no_dtd&getfields=*&oe=UTF-8&ie=UTF-8&ud=1&exclude_apps=1&num=1000&access=p&sort=date:D:L:d1&entqr=3&entqrm=0&lr=lang_en&ulang=&ip=10.120.2.11&wc=200&wc_mc=1&q=+inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers&dnavs=inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers
烧录器与开发板用ISP连接,连接方法不提了。烧录器需进行设置,见下图
![](http://img.blog.csdn.net/20160421194840517?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3、UART程序问题
winavr与avrstudio程序优化比较厉害,和keil后很多区别
1、不同芯片寄存器名不一样,已avrstudio右上角I/O view里的为准
2、中断响应函数声明方法为:SIGNAL(SIG_UART_RECV)//AVR Studio用此方式,SIG_UART_RECV是中断号,定义在winavr安装目录的iom16.h头文件中,文件位置在winavr安装目录/avr/include/avr下
3、中断程序中操作的变量应在声明时加上
volatile 声明,否则gcc不认,会被优化掉
4、用cli();关中断,用sei();开中断。
5、头文件声明见源码
源码:
#include <avr/io.h> //IO相关头文件
#include <avr/interrupt.h> //中断相关头文件
#define LED_BIT 0x20 //定义LED对应的I/O口操作位
#define NOP() __asm("nop")
volatile unsigned char RecvData;
volatile unsigned char UART_RecvData;
/*串口初始化函数*/
void Uart_Init(void)
{
//UCSRA = 0x02; /*倍速*/
UCSRC = 0x86; //异步,8位数据,无奇偶校验,一个停止位,无倍速
UCSRA = 0x00;
UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //使能接收,使能发送
UBRRL = 103; /*9600*/
UART_RecvData = 0;
}
/*数据发送,查询方式*/
void Uart_Transmit(unsigned char i)
{
while (!(UCSRA & (1<<UDRE))); /* 等待发送缓冲器为空*/
UDR = i; /* 发送数据*/
}
//串口接收中断
SIGNAL(SIG_UART_RECV)//AVR Studio用此方式
{
RecvData = UDR; //发送接收到的字符
UART_RecvData = 1;
PORTB =~PORTB;//PD7 低电平LED 灭
}
int main(void)
{
//unsigned char temp;
DDRB = 0xFF; /*方向输出*/
PORTB = 0xFF; /*电平设置*/
PORTB |= LED_BIT;//PD7 高电平LED 亮
cli();
Uart_Init();
sei();
Uart_Transmit('O');
Uart_Transmit('K');
while (1)
{
if(UART_RecvData == 1)
{
UART_RecvData = 0;
Uart_Transmit(RecvData);
}
}
return 0;
}
采用AvrStudio+WinAVR。先装AvrStudio,再装WinAVR。下载及安装方法见:
http://jingyan.baidu.com/article/8cdccae9487d39315413cd88.html
2、硬件准备
开发板为arduino uno R3,芯片为atmega328p(单独买了一块atmega8),烧录器为Risym,淘宝买的。烧录软件为progisp1.72。芯片资料从atmel官网上下,地址:
http://www.atmel.com/search.aspx?filter=0&btnG=Search&site=en_collection&client=support_frontend&proxystylesheet=support_frontend&output=xml_no_dtd&getfields=*&oe=UTF-8&ie=UTF-8&ud=1&exclude_apps=1&num=1000&access=p&sort=date:D:L:d1&entqr=3&entqrm=0&lr=lang_en&ulang=&ip=10.120.2.11&wc=200&wc_mc=1&q=+inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers&dnavs=inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers
烧录器与开发板用ISP连接,连接方法不提了。烧录器需进行设置,见下图
3、UART程序问题
winavr与avrstudio程序优化比较厉害,和keil后很多区别
1、不同芯片寄存器名不一样,已avrstudio右上角I/O view里的为准
2、中断响应函数声明方法为:SIGNAL(SIG_UART_RECV)//AVR Studio用此方式,SIG_UART_RECV是中断号,定义在winavr安装目录的iom16.h头文件中,文件位置在winavr安装目录/avr/include/avr下
3、中断程序中操作的变量应在声明时加上
volatile 声明,否则gcc不认,会被优化掉
4、用cli();关中断,用sei();开中断。
5、头文件声明见源码
源码:
#include <avr/io.h> //IO相关头文件
#include <avr/interrupt.h> //中断相关头文件
#define LED_BIT 0x20 //定义LED对应的I/O口操作位
#define NOP() __asm("nop")
volatile unsigned char RecvData;
volatile unsigned char UART_RecvData;
/*串口初始化函数*/
void Uart_Init(void)
{
//UCSRA = 0x02; /*倍速*/
UCSRC = 0x86; //异步,8位数据,无奇偶校验,一个停止位,无倍速
UCSRA = 0x00;
UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //使能接收,使能发送
UBRRL = 103; /*9600*/
UART_RecvData = 0;
}
/*数据发送,查询方式*/
void Uart_Transmit(unsigned char i)
{
while (!(UCSRA & (1<<UDRE))); /* 等待发送缓冲器为空*/
UDR = i; /* 发送数据*/
}
//串口接收中断
SIGNAL(SIG_UART_RECV)//AVR Studio用此方式
{
RecvData = UDR; //发送接收到的字符
UART_RecvData = 1;
PORTB =~PORTB;//PD7 低电平LED 灭
}
int main(void)
{
//unsigned char temp;
DDRB = 0xFF; /*方向输出*/
PORTB = 0xFF; /*电平设置*/
PORTB |= LED_BIT;//PD7 高电平LED 亮
cli();
Uart_Init();
sei();
Uart_Transmit('O');
Uart_Transmit('K');
while (1)
{
if(UART_RecvData == 1)
{
UART_RecvData = 0;
Uart_Transmit(RecvData);
}
}
return 0;
}
相关文章推荐
- Google 的开源技术protobuf 简介与例子
- LeetCode 第 326 题 (Power of Three)
- iOS第三方库汇总[转载]
- 结对编程2
- SQL触发器简单实例
- HTTPS的误解(一)
- 常用RGB颜色表
- Trie树(c++实现)
- javascript冒泡事件的意义及如何阻止冒泡事件
- 1014
- Laravel5.2多对多的实现
- Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务
- Linux下压缩某个文件夹(文件夹打包)
- CocoaPods 使用总结记录
- linux驱动基础系列--Linux I2c驱动分析
- Hive学习四
- Eclipse安装SVN插件
- json&&xml(1~2)
- 自定义xamarin.forms Entry 背景色以及边框
- Varnish基础进阶