在线时间471 小时
UID406727
ST金币0
蝴蝶豆17
注册时间2012-12-12
论坛元老
- 最后登录
- 2020-12-9
|
楼主 |
发表于 2014-2-21 12:48:07
|
显示全部楼层
a0a.1 0b0c
【STM32F0开发日志】+数字逻辑芯片模拟与检测功能的实现
功能要求:
以四2输入与非门芯片74LS00为例,实现该芯片的功能模拟及质量检测。其它逻辑芯片仿此。
STM32F030的芯片引脚与74LS00引脚的对应关系如下:
PC0—1A PC1—1B PC2—2A PC3—2B PC4—3A PC5—3B PC6—4A PC7—4B
PA0—1Y PA1—2Y PA2—3Y PA3—4Y
在功能模拟时,由PC口来读取外部信号的电平高低(通过开关手动设置信号),用PA口来模拟输出,并由LED发光二极管来指示输出状态,LED发光代表高电平,否则代表低电平。
在质量检测时,将芯片74LS00插入已连线的管座,由PC口来向74LS00提供测试信号,用PA口来读取74LS00的输出信号,从而按真值表判别出芯片的好坏,当绿灯(PB8—LED)亮时,表示正常;否则表示异常。
程序代码:
// 数字逻辑芯片模拟与检测程序之芯片模拟
#include "stm32f0xx.h"
#define BSRR_VAL 0x0300
GPIO_InitTypeDef GPIO_InitStructure;
static uint8_t g_ubMultiple_us = 0;
static uint16_t g_uwMultiple_ms = 0;
// 系统时钟初始化函数
void Delay_Init(uint8_t sysclk)
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
// 选择Tick时钟源——系统时钟
g_ubMultiple_us = sysclk;
g_uwMultiple_ms = (uint16_t)sysclk * 1000;
}
// 毫秒延时函数
void Delay_ms(uint16_t time)
{
uint32_t ulTemp = 0;
SysTick->LOAD = (uint32_t)time * g_uwMultiple_ms;
SysTick->VAL = 0;
// 赋值可清除SysTick_CTRL_COUNTFLAG_Msk 位
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
// 启动计时器
do
{
ulTemp = SysTick->CTRL;
}
while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk);
// 等到计数完成
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
// 停止计时器
SysTick->VAL = 0;
}
// 按键扫描函数
uint8_t PIN_X(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
{
return 0 ;
}
else
{
return 1;
}
}
// 主函数
main(void)
{
Delay_Init(8);
// 配置输入输出引脚
// 输出引脚
// 输入引脚
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); // GPIOC时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | /
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置管脚为输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 输出引脚
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // GPIOA时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置管脚为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
if(PIN_X (GPIOC,GPIO_Pin_0)&& PIN_X (GPIOC,GPIO_Pin_1))
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0 );
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_0 );
}
if(PIN_X (GPIOC,GPIO_Pin_2)&& PIN_X (GPIOC,GPIO_Pin_3))
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1 );
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_1 );
}
if(PIN_X (GPIOC,GPIO_Pin_4)&& PIN_X (GPIOC,GPIO_Pin_5))
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2 );
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_2 );
}
if(PIN_X (GPIOC,GPIO_Pin_6)&& PIN_X (GPIOC,GPIO_Pin_7))
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3 );
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_3 );
}
}
}
// 数字逻辑芯片模拟与检测程序之芯片检测
#include "stm32f0xx.h"
#define BSRR_VAL 0x0300
GPIO_InitTypeDef GPIO_InitStructure;
static uint8_t g_ubMultiple_us = 0;
static uint16_t g_uwMultiple_ms = 0;
// 系统时钟初始化函数
void Delay_Init(uint8_t sysclk)
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
// 选择Tick时钟源——系统时钟
g_ubMultiple_us = sysclk;
g_uwMultiple_ms = (uint16_t)sysclk * 1000;
}
// 毫秒延时函数
void Delay_ms(uint16_t time)
{
uint32_t ulTemp = 0;
SysTick->LOAD = (uint32_t)time * g_uwMultiple_ms;
SysTick->VAL = 0;
// 赋值可清除SysTick_CTRL_COUNTFLAG_Msk 位
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
// 启动计时器
do
{
ulTemp = SysTick->CTRL;
}
while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk);
// 等到计数完成
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
// 停止计时器
SysTick->VAL = 0;
}
// 按键扫描函数
uint8_t PIN_X(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
{
return 0 ;
}
else
{
return 1;
}
}
// 主函数
main(void)
{
Delay_Init(8);
// 配置输入输出引脚
// 输出引脚
// 输入引脚
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // GPIOC时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置管脚为输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 输出引脚
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); // GPIOA时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| /
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置管脚为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // GPIOA时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置管脚为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_8 );
GPIO_ResetBits(GPIOC,GPIO_Pin_0 );
GPIO_ResetBits(GPIOC,GPIO_Pin_1 );
if(PIN_X (GPIOA,GPIO_Pin_0)==0)
{
goto ERR ;
}
GPIO_ResetBits(GPIOC,GPIO_Pin_2 );
GPIO_ResetBits(GPIOC,GPIO_Pin_3 );
if(PIN_X (GPIOA,GPIO_Pin_1)==0)
{
goto ERR ;
}
GPIO_ResetBits(GPIOC,GPIO_Pin_4 );
GPIO_ResetBits(GPIOC,GPIO_Pin_5 );
if(PIN_X (GPIOA,GPIO_Pin_2)==0)
{
goto ERR ;
}
GPIO_ResetBits(GPIOC,GPIO_Pin_6 );
GPIO_ResetBits(GPIOC,GPIO_Pin_7 );
if(PIN_X (GPIOA,GPIO_Pin_3)==0)
{
goto ERR ;
}
while (1);
ERR: GPIO_ResetBits(GPIOB,GPIO_Pin_8 );
while (1);
} |
|