几年来,我一直在修改 AVR 和 PIC 微控制器代码,但从未从头开始编写任何东西,我对此非常了解。
我现在开始编写自己的代码,但开始时遇到了麻烦。我想知道其他人是如何开始编写代码的,以及是否有人会推荐这方面的书或教程。
您是否从编写初始化函数开始,然后中断,然后是计时器,然后是主 while(1) 循环...我想知道最好的入门方法是什么。
谢谢
几年来,我一直在修改 AVR 和 PIC 微控制器代码,但从未从头开始编写任何东西,我对此非常了解。
我现在开始编写自己的代码,但开始时遇到了麻烦。我想知道其他人是如何开始编写代码的,以及是否有人会推荐这方面的书或教程。
您是否从编写初始化函数开始,然后中断,然后是计时器,然后是主 while(1) 循环...我想知道最好的入门方法是什么。
谢谢
AVRFreaks有一个由 Dean Camera(又名abcminuser )编写的优秀教程,名为模块化 C 代码:管理大型项目。您可能还对阅读James Wagner的微处理器状态机感兴趣。
我最喜欢的 AVR-from-scratch-in-C 教程是https://www.mainframe.cx/~ckuethe/avr-c-tutorial/
对于小型嵌入式系统,每个人都有自己的风格。这是我的:
我喜欢使用很多 C 文件,每个文件的名称构成函数的前缀。例如,led_init()
和led_tick()
都在led.c
. 这使事物保持模块化并有助于便携性。
我使用common.h
头文件来定义类型,但每个模块都有单独的包含。
我倾向于使用一个自由运行的系统计时器(在 a 中systime.c
),然后让模块调用一个systime_get()
函数来获取当前时间(以系统滴答声或毫秒为单位)。X_tick()
然后,每个模块都可以使用这些功能通过软件定时器来安排事件。
常见的.h:
#ifndef COMMON_H
#define COMMON_H
#include <stdio.h> // general purpose headers
#include <stdint.h>
#include <stdbool.h>
...
#endif
uart.h:
#ifndef UART_H
#define UART_H
#include <avr/usart.h> // microcontroller specific headers for uart
...
void uart_init(void);
void uart_putc(uint8_t ch);
...
#endif
UART.c:
#include "common.h"
#include "uart.h"
void uart_isr(void) __interrupt VECTOR
{
// handle incoming data
}
void uart_init(void)
{
// setup hardware
}
void uart_putc(uint8_t ch)
{
UART_TX_FIFO_REGISTER = ch;
while(!TX_COMPLETE_REGISTER);
}
led.h:
#ifndef LED_H
#define LED_H
#include <avr/ioports.h> // microcontroller specific headers for port io
...
#define LED_DDR PORTAD
#define LED_PIN 5
#define LED_MASK (1 << LED_PIN)
#define LED_PORT PORTA
void led_init(void);
void led_set(void);
void led_tick(void);
...
#endif
led.c:
#include "common.h"
#include "led.h"
void led_init(void)
{
LED_DDR |= LED_MASK;
}
void led_set(void)
{
LED_PORT |= LED_MASK;
}
void led_tick(void)
{
// animate LEDs in an amusing fashion
}
主.c:
#include "common.h"
#include "led.h"
#include "uart.h"
int main(void)
{
led_init();
uart_init();
...
led_set();
while(1)
{
led_tick();
uart_tick();
}
return 0;
}